リノシス開発者ブログ

株式会社リノシスのエンジニアブログです。

catjでjsonをgrepする

jsongrepすることができるcatjの紹介

f:id:hiromichinomata:20200121141754p:plain:w200

前口上

こんにちは. 技術顧問をやっている野又です。直近ではサーバーサイド(Rails)や画像認識, .NETのレビュー, 全体のマネジメントを行っています。

さて、jsonから必要な情報を使いたい時に使用するツールはなんでしょうか?jqコマンドが有名ですが、使い方が独特ですよね(個人の意見です)。可能なら慣れ親しんだシェルでgrepしたい. そんなときに便利なcatjの紹介

インストール

node.jsが必要です. README通りnpmで入れます.

npm install -g catj

サンプルデータ

以下のサンプルデータを使います

[
  {
    "name": "burger",
    "category": "burger",
    "price": 400
  },
  {
    "name": "cheese burger",
    "category": "burger",
    "price": 500
  },
  {
    "name": "double cheese burger",
    "category": "burger",
    "price": 600
  },
  {
    "name": "cola",
    "category": "drink",
    "price": 100
  },
  {
    "name": "orange juice",
    "category": "drink",
    "price": 100
  }
]

基本

jsonをいれるとflatな形式に変換してくれます

$ catj sample.json

.[0].name = "burger"
.[0].category = "burger"
.[0].price = 400
.[1].name = "cheese burger"
.[1].category = "burger"
.[1].price = 500
.[2].name = "double cheese burger"
.[2].category = "burger"
.[2].price = 600
.[3].name = "cola"
.[3].category = "drink"
.[3].price = 100
.[4].name = "orange juice"
.[4].category = "drink"
.[4].price = 100

grepと組み合わせる

jqとも比較してみましょう

nameだけ抽出

jq

$ cat sample.json |jq  '.[].name'

"burger"
"cheese burger"
"double cheese burger"
"cola"
"orange juice"

catj

$ catj sample.json |grep name

.[0].name = "burger"
.[1].name = "cheese burger"
.[2].name = "double cheese burger"
.[3].name = "cola"
.[4].name = "orange juice"

index 1のみ抽出. catjのraw出力はカラーコードを含むようです

jq

$ cat sample.json |jq  '.[1]'

{
  "name": "cheese burger",
  "category": "burger",
  "price": 500
}

catj

$ catj sample.json |grep '\[.*1.*\]'

.[1].name = "cheese burger"
.[1].category = "burger"
.[1].price = 500

簡単な例だとあまり変わらないですね. ネストが深いときにさくっとkeyの名前でフィルターかけられるのが売りだと思います.

制限

Issueに上がっていますが、現状だと逆操作(flat => json)はできないようです

宣伝

RenoSysではjsonを巧みに処理できるRailsエンジニアを募集中です

en-gage.net