私は次の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