首页 > 解决方案 > 迭代 jq 循环:如果 value.subvalue 匹配条件,则分配键

问题描述

我正在尝试对值与特定条件匹配的键执行一些工作。首先,当我在 linux 中执行 CLI 工具时,我正在使用的 json 看起来与此类似:

$ ./sacli ClusterQuery

  "i-aaaaaaabbbbbbbbbb": {
    "sacli_ip": "10.0.52.37",
    "sacli_listen_ip": "10.0.52.37",
    "sacli_port": "945"
  },
  "i-ccccccccddddddddd": {
    "sacli_ip": "10.0.48.68",
    "sacli_listen_ip": "10.0.48.68",
    "sacli_port": "945"
  }

理想情况下,我希望遍历这些条目,进行检查,然后根据检查执行操作。所以从概念上讲:

for i in $(./sacli ClusterQuery | jq -r '<some syntax to get each key, value>'); do
  node_id=key
  ip=value.sacli_ip

  ping -c 1 -W 1 $ip
  ping_result=$?

  if [[ $ping_result -eq 1 ]]; then #ping has failed
     ./remove $node_id
  fi
done

标签: jsonbashiterationjq

解决方案


我会避免你的for循环,转而使用管道while,如下所示:

./sacli ClusterQuery | jq -rc '
    keys_unsorted[] as $k | $k, .[$k].sacli_ip' |
  while read -r node_id ; do
    read -r ip   
    ping -c 1 -W 1 "$ip"
    ping_result=$?
    if [[ $ping_result -eq 1 ]]; then #ping has failed
      echo ./remove "$node_id"
    fi
  done

这假设键和 sacli_ip 值没有嵌入换行符。

您当然可以轻松地select在 jq 程序中添加适当的过滤器。

那里是为了-c安全。


推荐阅读