如何将 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",
          },
          
    ]

我想将以“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

相关内容