Shell でjsonの配列の変数から value を抜き出す

a snow covered mountain range under a night sky

キーが固定の場合

以下は、シェルスクリプトでJSONデータを読み込み、jqコマンドを使用して同様の処理を行う例です。

#!/bin/bash

json='[{"name":"Worker","no":"123"}, {"name":"User","no":"456"}, {"name":"Organization","no":"789"}, {"name": "Position","no":"123"}, {"name": "PositionTranslation","no":"123"}]'

echo "$json" | jq -c '.[]' | while read -r item; do
  name=$(echo "$item" | jq -r '.name')
  no=$(echo "$item" | jq -r '.no')
  
  echo "$name"
  echo "$no"
  echo "-----"
done

このスクリプトでは:

  1. json変数にJSONデータを文字列として格納します。
  2. echo "$json" | jq -c '.[]'を使用して、JSONデータをパイプでjqコマンドに渡し、各オブジェクトを個別の行に分割します。
  3. while read -r itemを使用して、各オブジェクトを1つずつ読み込みます。
  4. echo "$item" | jq -r '.name'echo "$item" | jq -r '.no'を使用して、各オブジェクトからnamenoの値を抽出します。
  5. 抽出した値とセパレーターを表示します。

結果はこちらです

Worker
123
-----
User
456
-----
Organization
789
-----
Position
123
-----
PositionTranslation
123
-----

キーが固定でない場合(接頭辞が共通の場合)

JSONデータのキーが一部共通している場合、jqコマンドの to_entriesselectmapを組み合わせて目的の値を取得することができます。以下は、public_ip で始まるキーに対応する値を取得する例です。

#!/bin/bash

json='{"public_ip01": "1.2.3.4", "public_ip02": "2.3.4.5", "public_ip03": "12.2.3.4"}'

echo "$json" | jq -r 'to_entries | map(select(.key | startswith("public_ip")).value)'

このスクリプトでは:

  1. json 変数にJSONデータを文字列として格納します。
  2. echo "$json" | jq -r 'to_entries | map(select(.key | startswith("public_ip")).value)' を使用して、JSONデータを jq コマンドに渡し、以下の処理を行います:
    • to_entries で、JSONオブジェクトをキーと値のペアの配列に変換します。
    • map(select(.key | startswith("public_ip"))) で、キーが "public_ip" で始まるエントリーのみを選択します。
    • .value で、選択されたエントリーの値のみを取得します。
  3. jq の出力は、選択された値の配列になります。

このスクリプトを実行すると、以下のような結果が得られます

"1.2.3.4" "2.3.4.5" "12.2.3.4"

これにより、public_ip で始まるキーに対応する値が取得できました。必要に応じて、この出力を変数に格納したり、ループ処理で個別に処理したりすることができます。