我有以下 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",
},
]
我想将以“abacus-ap-hf-test”开头且不带“:8080”的所有主机名值获取到变量中,然后希望通过 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
这可以在 shell 中循环读取:
jq -r '.[].hostname | select(startswith("abacus-ap-hf-test")) | rtrimstr(":8080")' file |
while IFS= read -r host; do
# do something with "$host"
done