Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 迭代jq循环:如果value.subvalue与条件匹配,则分配键_Json_Bash_Iteration_Jq - Fatal编程技术网

Json 迭代jq循环:如果value.subvalue与条件匹配,则分配键

Json 迭代jq循环:如果value.subvalue与条件匹配,则分配键,json,bash,iteration,jq,Json,Bash,Iteration,Jq,我试图对值与特定条件匹配的键执行一些操作。首先,在linux中执行CLI工具时,我使用的json看起来与此类似: $ ./sacli ClusterQuery "i-aaaaaaabbbbbbbbbb": { "sacli_ip": "10.0.52.37", "sacli_listen_ip": "10.0.52.37", "sacli_port"

我试图对值与特定条件匹配的键执行一些操作。首先,在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
以美元表示的i(./sacli ClusterQuery | jq-r');做 node_id=key ip=value.sacli\u ip ping-c 1-W 1$ip ping_结果=$? 如果[$ping_结果-等式1]];那么#ping失败了 /删除$node\u id fi 完成
我会避免您的
for
循环,而选择管道连接到
,就像这样:

./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值没有嵌入换行符

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


-c
是为了安全而存在的。

请修复示例JSON。