JSON データを自由に加工・整形できるのが jq
コマンドです。
REST API の開発時など、JSON データを取り扱う際に便利に使えます。
今回は、jq コマンドのオプションや活用事例について解説します。
⇒ jq のインストール手順(CentOS)
⇒ jq コマンド応用編
jq コマンドとは
jq
コマンドとは、JSON データを加工するためのコマンドです。
次のような操作が簡単に行なえます。
- インデントや改行を追加して可読性を高める
- 任意の項目のみを抽出する
- JSON内のキー一覧を取得する
- 最大値・最小値・合計・平均などの集計を行う
今回は、以下の JSON をサンプルデータとして使用しました。
$ cat json.txt
{"update":"2018-10-10 22:00:00","items":[{"id":1,"name":"apple","price":200},{"id":2,"name":"grape","price":300},{"id":3,"name":"melon","price":900}]}
jq コマンドでインデントと改行を付加する
整形するために、jq .
を実行します。ドット .
がデータの先頭(最上位)を意味します。
インデントと改行が追加されて読みやすくなりました。
$ cat json.txt | jq .
{
"items": [
{
"price": 200,
"name": "apple",
"id": 1
},
{
"price": 300,
"name": "grape",
"id": 2
},
{
"price": 900,
"name": "melon",
"id": 3
}
],
"update": "2018-10-10 22:00:00"
}
jq コマンドで特定の項目のみを抽出する
必要な項目が限られている場合は、jq コマンドで絞り込めます。
update
だけを取り出すには .update
を指定します。
$ cat json.txt | jq .update
"2018-10-10 22:00:00"
配列のデータを指定することも可能です。items
の3つ目を取り出す例です。
(※配列は「0番目」から始まるため、3つ目の要素は2番となります。)
$ cat json.txt | jq .items[2]
{
"price": 900,
"name": "melon",
"id": 3
}
複数の階層でも一度に指定できます。items
の3つ目から name
だけを取り出す例です。
$ cat json.txt | jq .items[2].name
"melon"
ダブルクォーテーションが不要な場合は -r
で取り除けます。
$ cat json.txt | jq -r .items[2].name
melon
JSON内のキー一覧を取得する
取り出したいキーを確認するためには -c paths
オプションが利用できます。
JSONに含まれるキーを全てまとめて確認可能です。
$ cat json.txt | jq -c paths
["update"]
["items"]
["items",0]
["items",0,"id"]
["items",0,"name"]
["items",0,"price"]
["items",1]
["items",1,"id"]
["items",1,"name"]
["items",1,"price"]
["items",2]
["items",2,"id"]
["items",2,"name"]
["items",2,"price"]
jq コマンドでデータを集計する
items
の中にある price
を全て合計する例を紹介します。
まずは price
だけを一括で取り出します。
$ cat json.txt | jq .items[].price
200
300
900
500
取り出した値をひとまとめにするため、全体を配列で囲みます。
$ cat json.txt | jq [.items[].price]
[
200,
300,
900,
500
]
次に、抽出した配列を add
に受け渡すことで合計を算出します。
パイプ記号 |
を使うことで、1つの JSON に対して複数回の jq
を実行可能です。
$ cat json.txt | jq "[.items[].price] | add"
1900
まとめ
JSON データの加工に便利な jq
コマンドについて解説しました。
今回ピックアップした機能以外にも、非常に多くの柔軟な加工方法が利用できます。
シェルスクリプトとの相性も非常に良いため、JSON データを扱う際にはぜひ活用ください。
【関連記事】
⇒ jq コマンドの活用(応用編)
⇒ jq コマンドのインストール手順 (CentOS)
⇒ MySQL のクエリ結果を整形するコマンド
⇒ curl で POST リクエストを送信する方法
⇒ CentOS 6 と CentOS 7 のコマンド比較
⇒ Apache アクセスログを解析するコマンド