如何使用jq高效统计JSON中的HTTP状态码出现次数?
使用jq统计HTTP状态码出现次数
直接用jq的reduce命令就能高效实现状态码计数,无需复杂循环语法,核心命令如下:
jq 'reduce .[] as $item ({}; .[$item.status|tostring] += 1)'
命令拆解
reduce .[] as $item:遍历输入JSON数组的每一个元素,将当前元素赋值给$item({}; ...):初始化一个空对象作为计数容器.[$item.status|tostring] += 1:提取当前元素的status字段,转成字符串(jq对象键必须为字符串类型),对应键的计数加1
示例演示
输入JSON
[ {"status": 200, "url": "example.com"}, {"status": 301, "url": "google.com"}, {"status": 403, "url": "forbidden.com"}, {"status": 200, "url": "github.com"} ]
执行命令后输出
{ "200": 2, "301": 1, "403": 1 }
可选:让输出键为数字类型
如果希望结果中的键是数字而非字符串,可以追加with_entries处理:
jq 'reduce .[] as $item ({}; .[$item.status|tostring] += 1) | with_entries(.key |= tonumber)'
对应的输出会变成:
{ 200: 2, 301: 1, 403: 1 }
对比Python等效实现
你提到的Python实现大概是这样:
import json from collections import Counter data = json.loads(input()) status_counts = Counter(item["status"] for item in data) print(json.dumps(status_counts))
jq的实现和Python逻辑一致,但无需额外编写脚本,直接通过命令行就能完成,且处理大体积JSON时比bash循环高效得多——因为jq是一次性解析处理整个JSON结构,避免了bash循环中逐行处理、反复启动子进程的开销。
内容的提问来源于stack exchange,提问作者Elliot
相关产品推荐
相关产品推荐

