jqコマンドのループ処理

シェルスクリプトのJSONパースには jqを活用できます。
データ構造に合わせてjq '.items[0].id'といったフィールドアクセサを書くことで目的のデータを取得します。

JSONが配列を含んでいる場合にも、以下のような制御構造でシェル向けのループ処理が可能です。

export JSON='{ "items": [{ "id": 1 }, { "id": 2 }]}'

for item in $(echo $JSON | jq -c '.items[]'); do
  echo $item | jq '.id'
done

外側のjq -c '.items[]'は、Array Iteratorの機能により以下のような出力を行います。

{"id":1}
{"id":2}

bashのforループで一行ずつ取り出すことで再帰的に処理できます。
この出力は有効なJSONですから、ループ内でもう一度jqに入力することで任意のフィールドを取り出せます。

ポイントは、外側のjq-cオプションを指定して一行出力することです。
デフォルトでは表示向けの整形により、{"id":1}が3行で出力されます。この場合、各行は有効なJSONではないため、ループ内でエラーになります。

⁋ 2022/01/14↻ 2024/11/07
中馬崇尋
Chuma Takahiro