Edited at

jqコマンドでjsonデータを整形・絞り込み

More than 1 year has passed since last update.


jq コマンドでjsonデータを整形・絞り込みする方法

jqはJSON用のsedのようなコマンドでデータのフィルタや置き換え、整形ができます。

2014/04/10追記

コメントでpipeする際jqコマンドは不要と教えて頂きました。


インストール

homebrew でインストールできます。

brew install jq

他の方法はこちらを参照

http://stedolan.github.io/jq/download/


インデント

jqコマンドに渡すだけでインデントできる。

このようなデータがあったとして、

[{"name": "Ann", "age": 20},{"name": "Bob", "age": 50},{"name": "Unknown", "age": 45}]

jq コマンドに与えるとインデントして表示される。 . は すべてのデータを指す

echo '[{"name": "Ann", "age": 20},{"name": "Bob", "age": 50},{"name": "Unknown", "age": 45}]' | jq .  

[

{
"age": 20,
"name": "Ann"
},
{
"age": 50,
"name": "Bob"
},
{
"age": 45,
"name": "Unknown"
}
]


絞り込み

1つ目のデータを取得したい場合は . では無く .[0]を指定する

echo '[{"name": "Ann", "age": 20},{"name": "Bob", "age": 50},{"name": "Unknown", "age": 45}]' | jq '.[0]'       

{

"age": 20,
"name": "Ann"
}

age > 30 以上を取得したいならmap , selectを使う

echo '[{"name": "Ann", "age": 20},{"name": "Bob", "age": 50},{"name": "Unknown", "age": 45}]' | jq 'map(select( .["age"] > 30))'    

[

{
"age": 50,
"name": "Bob"
},
{
"age": 45,
"name": "Unknown"
}
]

age > 30 のnameだけを取得したいときはさらに jqで絞り込み

echo '[{"name": "Ann", "age": 20},{"name": "Bob", "age": 50},{"name": "Unknown", "age": 45}]' | jq 'map(select( .["age"] > 30))' | jq '.[].name'

"Bob"

"Unknown"

jqの中でpipeさせることもできる。その場合はjqコマンドは1つでよい。

echo '[{"name": "Ann", "age": 20},{"name": "Bob", "age": 50},{"name": "Unknown", "age": 45}]' | jq 'map(select( .["age"] > 30)) | .[].name'

配列の長さを取りたいときは length を使う

echo '[{"name": "Ann", "age": 20},{"name": "Bob", "age": 50},{"name": "Unknown", "age": 45}]' | jq length  

3


参考