问题描述
我正在尝试对值与特定条件匹配的键执行一些工作。首先,当我在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
解决方法
我会避免您的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值没有嵌入换行符。
您当然可以轻松地在jq程序中添加适当的select
过滤器。
为了安全起见,-c
在那里。