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 回去。