JSONファイルのデータを変数に抽出する方法

JSONファイルのデータを変数に抽出する方法

私は次のjson形式を持っています:デフォルトでは、これはこれらの項目を複数含む巨大なファイルです。

 [
      {
        "id": "kslhe6em",
        "version": "R7.8.0.00_BNK",
        "hostname": "abacus-ap-hf-test-001:8080",
        "status": "RUNNING",
           },
      {
        "id": "2bkaiupm",
        "version": "R7.8.0.00_BNK",
        "hostname": "abacus-ap-hotfix-001:8080",
        "status": "RUNNING",
      },
      {
        "id": "rz5savbi",
        "version": "R7.8.0.00_BNK",
        "hostname": "abacus-ap-hf-test-005:8080",
        "status": "RUNNING",
          },
          
    ]

":8080"なしで "abacus-ap-hf-test"で始まるすべてのホスト名の値を変数として取得し、forループを介してこの値を使用して以下のように追加のコマンドを実行しようとしています。しかし、この情報をどのように抽出できるかは少し混乱しています。

HOSTAME="abacus-ap-hf-test-001 abacus-ap-hf-test-005"
for HOSTANAME in $HOSTNAME
do 
  sh ./trigger.sh
done

ベストアンサー1

JSONの解析jq

  • すべての項目を取り出しますhostname
  • プレフィックス文字列でフィルタリングします。
  • サフィックス文字列を削除します。
jq -r '.[].hostname | select(startswith("abacus-ap-hf-test")) | rtrimstr(":8080")' file

または等しく、

jq -r 'map(select(.hostname|startswith("abacus-ap-hf-test")).hostname | rtrimstr(":8080"))[]' file

質問のサンプル文書の場合(意味のない末尾のコンマを削除した後)、次の結果が生成されます。

abacus-ap-hf-test-001
abacus-ap-hf-test-005

whileこれはシェルループから読み取ることができます。

jq -r '.[].hostname | select(startswith("abacus-ap-hf-test")) | rtrimstr(":8080")' file |
while IFS= read -r host; do
    # do something with "$host"
done

おすすめ記事