キーが固定の場合
以下は、シェルスクリプトで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
このスクリプトでは:
json
変数にJSONデータを文字列として格納します。echo "$json" | jq -c '.[]'
を使用して、JSONデータをパイプでjq
コマンドに渡し、各オブジェクトを個別の行に分割します。while read -r item
を使用して、各オブジェクトを1つずつ読み込みます。echo "$item" | jq -r '.name'
とecho "$item" | jq -r '.no'
を使用して、各オブジェクトからname
とno
の値を抽出します。- 抽出した値とセパレーターを表示します。
結果はこちらです
Worker
123
-----
User
456
-----
Organization
789
-----
Position
123
-----
PositionTranslation
123
-----
キーが固定でない場合(接頭辞が共通の場合)
JSONデータのキーが一部共通している場合、jq
コマンドの to_entries
、select
、map
を組み合わせて目的の値を取得することができます。以下は、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)'
このスクリプトでは:
json
変数にJSONデータを文字列として格納します。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
で、選択されたエントリーの値のみを取得します。
jq
の出力は、選択された値の配列になります。
このスクリプトを実行すると、以下のような結果が得られます
"1.2.3.4" "2.3.4.5" "12.2.3.4"
これにより、public_ip
で始まるキーに対応する値が取得できました。必要に応じて、この出力を変数に格納したり、ループ処理で個別に処理したりすることができます。