如何使用jq处理含重复IP的JSON数据并按IP聚合输出host与id
实现方案
直接使用jq内置的分组能力即可完成需求,不需要额外编写bash循环逻辑,命令如下:
# 假设你的JSON保存在data.json文件中 jq -r 'group_by(.ip)[] | [.[0].ip, (.[] | .host, .id)] | join(" ")' data.json
如果需要从管道读取JSON内容,写法如下:
echo '[{"host":"cat","ip":"192.168.1.1","id":"cherry"},{"host":"dog","ip":"192.168.1.1","id":"apple"},{"host":"cat","ip":"192.168.1.2","id":"banana"}]' | jq -r 'group_by(.ip)[] | [.[0].ip, (.[] | .host, .id)] | join(" ")'
命令说明
-r参数让jq输出原始纯文本,不会给结果字符串添加外层引号group_by(.ip)会将输入的JSON数组按照ip字段的值分组,相同ip的所有记录会被归到同一个子数组中- 遍历每个分组后,先取分组第一条记录的ip作为行首,再遍历分组内所有记录依次取出host、id字段值,把所有值拼接为一个数组后用空格连接为整行输出
以上命令执行后的输出和你预期的效果完全一致。
内容的提问来源于stack exchange,提问作者Marry Jane
相关产品推荐
相关产品推荐

