jqコマンドの使い方メモ【JSONの整形・抽出・加工】
はじめに
jqは、JSONの整形・抽出加工するためのコマンドです。 APIのレスポンスやログ、設定ファイルなどにJSONがよく利用されます。 こういったJSONを活用するための方法をまとめました。
インストール
各OSで利用されるパッケージマネージャーからインストールができます。
macOS
brew install jq
Linux
sudo apt-get update
sudo apt-get install jq
Windows
winget install jqlang.jq
基本的な使い方
これから基本的な使い方をサンプルデータと一緒に確認していきます。
今回利用するサンプルデータは下記のuser.jsonです。
[
{"id": 1,"name": "Alice","age": 24},
{"id": 2,"name": "Bob","age": 30},
{"id": 3,"name": "Charlie","age": 28},
{"id": 4,"name": "Diana","age": 22},
{"id": 5,"name": "Edward","age": 35}
]
JSONの整形(Pretty Print)
json形式のテキストに対してjqを利用すると整形して見やすく表示できます。
cat user.json | jq
# または
jq . user.json
出力:
[
{
"id": 1,
"name": "Alice",
"age": 24
},
...
]
JSONの特定キーを抽出する
例: name を取り出す
echo '{"id": 1,"name": "Alice","age": 24}' | jq '.name'
出力:
"Alice"
配列の抽出とループ処理
cat user.json | jq '.[].id'
出力:
1
2
3
4
5
条件抽出
ageが20以上のnameを抽出する例です。
cat user.json | jq '.[] | select(.age > 20) | .name'
出力:
"Alice"
"Bob"
"Charlie"
"Diana"
"Edward"
CSV形式に変換
cat user.json | jq -r '.[] | [.name, .age] | @csv'
出力:
"Alice",24
"Bob",30
"Charlie",28
"Diana",22
"Edward",35
キー追加
echo '{"id": 1,"name": "Alice","age": 24}' | jq '. + { "role": "admin" }'
出力:
{
"id": 1,
"name": "Alice",
"age": 24,
"role": "admin"
}
キーの削除
del()を使うことでキーを削除できます。
echo '{"id": 1,"name": "Alice","age": 24}' | jq 'del(.age)'
出力:
{
"id": 1,
"name": "Alice"
}
複数キーを同時に抽出する
cat user.json | jq '.[] | {name: .name, age: .age}'
出力:
{
"name": "Alice",
"age": 24
}
{
"name": "Bob",
"age": 30
}
...
curlと組み合わせる
APIのレスポンスをそのままjqで整形するのが定番の使い方です。 JSONPlaceholderはダミーのJSONを返してくれる無料サービスで、登録不要で試すことができます。
# ユーザー一覧を取得して整形
curl -s https://jsonplaceholder.typicode.com/users | jq '.'
# 特定のキーだけ抽出
curl -s https://jsonplaceholder.typicode.com/users | jq '.[].name'
# 条件抽出(idが3以下のユーザー)
curl -s https://jsonplaceholder.typicode.com/users | jq '.[] | select(.id <= 3) | {id: .id, name: .name}'
よく利用するオプション
| オプション | 内容 |
|---|---|
-r | クォーテーションなしで出力 |
-c | compact表示(1行で出力) |
-S | キーをアルファベット順にソートする |
-n | 入力を読まずにnullから処理を開始する |
-e | 結果がfalse/nullの場合に終了コード1を返す |
メモ
.は現在のオブジェクトを表す.[]は配列を展開するselect()はフィルタリングに利用@csv,@tsv,@htmlなどフォーマット変換が便利- APIレスポンスの解析には
curl -s URL | jqが定番 - 大量データ解析は
jq -cでcompact表示 jqはsedやawkより JSON の加工に向いている