首页/系统/Linux 运维命令速查/jq 进阶:统计、构造与参数
文本处理77 条

jq 进阶:统计、构造与参数

jq 不止取字段:group_by 分组统计、add 求和、sort_by 排序、--arg 注入 shell 变量、@tsv/@csv 拼表,日志统计一步到位。

Linux 运维命令速查系统更新于 2026-10-13

jq 进阶是什么

jq 是 JSON 的命令行处理器,进阶用法集中在三类:聚合统计(group_by、add、length)、结果构造(-n 配 {} 与 []、@tsv 与 @csv 输出)、参数注入(--arg、--argjson)。掌握这三类,日志与接口数据的统计基本不必再写脚本。

基本信息

适用平台Linux / macOS / Windows 均有官方二进制
命令语法jq [选项] '过滤器' [文件]
常用函数length add sort_by group_by map select unique @tsv @csv
输入来源文件参数、标准输入管道,或用 -n 表示无输入

典型使用场景

  • 接口返回统计:按状态码分组计数,快速看清错误分布
  • 日志字段提取:把 JSON 日志的字段拼成 TSV,再交给 column 或 awk
  • 配置批量加工:读取配置后构造新结构,避免手工编辑大 JSON
  • 构造请求体:用 -n 与 --arg 在脚本中生成 JSON,绕开引号拼接问题
  • 排序取极值:sort_by 配合 last 或 first,稳定地取最新或最早一条

常用示例

常用示例
jq '[.items[].size] | add' stats.json                     # 求和
jq -r 'group_by(.code)[] | "\(.[0].code)\t\(length)"' hits.json | sort -rn
jq -r '.items[] | [.id, .name] | @tsv' data.json | column -t
jq -n --arg host web1 --argjson port 8080 '{host: $host, port: $port}'
jq 'sort_by(.ts) | last' events.json                      # 取时间最新的一条
jq 'select(.level == "error") | .msg' app.jsonl            # 过滤出错误级别消息
jq -S . config.json > config.sorted.json                   # 键排序,便于版本比对

常用选项与函数

选项或函数作用说明
-n无输入,用于构造新值常与 --arg 搭配生成 JSON
--arg k v注入字符串变量值始终是字符串
--argjson k v注入 JSON 变量可传数字、布尔、对象
-r输出原始字符串去掉 JSON 引号,便于拼 shell
-e按最后输出设置退出码false 或 null 时返回 1,可用于判断
group_by分组聚合必须先 sort_by
group_by 的实现只合并相邻元素,使用前必须先 sort_by,否则同一个分组会被拆成多段。
--arg 传入的值永远是字符串,需要数字或布尔时改用 --argjson,否则参与比较会出现类型不一致。
处理大文件时用逐行 JSON 或流式模式降低内存占用,把整个大数组一次性读进内存会在 GB 级文件上耗尽内存。
输出给 shell 使用时加 -r 去掉引号;字段里可能含制表符或换行时改用编码函数输出,避免后续切分错列。
把 jq 的输出重定向回同一个文件会先截断源文件导致内容全部丢失,必须写临时文件再 mv 回去。

易错点

  • group_by 前没 sort_by 会让分组结果被拆成多段,同一个 key 出现多次极容易误判计数
  • jq ... conf.json > conf.json 会先截断源文件导致内容全部丢失,必须写临时文件再 mv
  • 用 --arg 传数字得到的是字符串,与数字字段比较或相加会出错,应改用 --argjson
  • 对不存在的路径做比较或运算不会报错而是返回 null,统计前先用 keys 确认结构

数据来源与参考

  • man 1 jq(jq 1.7 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌