使用jq统计JSON日志中id.orig_h到id.resp_h的连接次数问题
错误原因
Cannot index number with string "id.orig_h":group_by是数组操作函数,你没有加--slurp(-s)参数把输入的JSON对象流整合成数组,函数作用于单个JSON对象时触发类型不匹配。string (" ") and number (225) cannot be added:join函数仅支持拼接全字符串类型的数组,你构造的输出数组中包含数值类型的连接计数,拼接时类型冲突。
修正后完整命令
jq -sr ' map(select(.resp_ip_bytes > 0 and .orig_ip_bytes > 0 and .duration > 0 and .orig_bytes > 0 and .resp_bytes > 0)) | group_by([."id.orig_h", ."id.resp_h"]) | map(.[0] + {count: length}) | sort_by(-.count, -.resp_ip_bytes) | .[] | [."id.orig_h", "->", ."id.resp_h", "|", (.count|tostring)] | join(" ") ' 日志文件路径
关键修正说明
- 保留
-s参数将输入的多JSON对象转为数组,适配group_by的入参要求 - 优化分组计数逻辑,直接取每组第一条记录加统计值,避免冗余遍历
- 拼接输出前用
tostring将数值类型的连接计数转为字符串,解决join的类型冲突问题 - 若仅需输出连接次数最高的第一条记录,将最后一行的
.[]替换为first即可,和你原有逻辑一致。
注:你提供的样例输入中所有记录的
resp_bytes、resp_ip_bytes均为0,默认筛选条件下无输出,可临时调整筛选条件验证语句效果。
内容的提问来源于stack exchange,提问作者net_solv
相关产品推荐
相关产品推荐

