json - 迭代 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
解决方案
我会避免你的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
安全。
推荐阅读
- ios - 如果单击特定的 CollectionViewCell 做某事
- r - 在R中使用正则表达式删除字符串中的特定子字符串
- python - python中字符串的比较(从文件中读取)不起作用
- java - SQL Developer V19 - 从连接 XML 中解密密码
- java - Java使用最低有效位从int数组返回字符串
- python-3.x - 你能创建一个改变的输入吗?
- discord - Discord.js 禁用 @evereyone 访问新频道
- ios - Xcode 打开全窗口模式
- html - 为什么元素显示底部填充和底部边框以及顶部边框和顶部填充搞砸了?
- angular - 检查来自 HTTP POST 请求的响应是否为 200