jq 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,聚焦
jq——结构化数据处理命令族(见结构化数据命令族)的代表。它是现代命令行工具(见现代工具)里处理 JSON 的标配。
jq 是命令行里的 JSON 处理器,地位等同于文本世界里的 awk:把 JSON 当作结构化数据来取字段、过滤、重组,而不是用 grep 正则去硬抠字符串。只要你的数据里冒出 {} 和 [],就该请出 jq。
一、基本取值
echo '{"name":"Tom","age":30}' | jq '.name' # "Tom"
echo '{"name":"Tom","age":30}' | jq '.age' # 30
cat data.json | jq '.users[0].name' # 取数组第 0 个的 name
jq '.items | length' data.json # 数组长度jq 的表达式以
.开头表示"根"。.name取字段,.users[0]取下标元素,可以链式.a.b[0].c。不加-r(raw)时字符串会带引号输出;要当纯文本用(比如塞进变量、拼命令)就加-r,否则引号会跟着进结果。
二、管道与 filter 组合
jq 内部也有 |,把前一个结果喂给下一个 filter:
jq '.users[] | .name' data.json # 展开数组,逐个取 name
jq '.users[] | select(.age > 18) | .name' data.json # 过滤后取字段
jq '.items[] | {id, name}' data.json # 重组为只含 id/name 的小对象
select(条件)是 jq 的"过滤行",等同 awk 的块前条件。{}构造器能挑出想要字段重组新对象——做"从大 JSON 抽小结构"特别顺。[]后缀把数组"展开"成多个独立结果,方便后面逐个处理或jq -r逐行输出。
三、map 与数组变换
jq '[.users[] | {name, adult: (.age>=18)}]' data.json # 构造新数组
jq 'map(.price * .qty)' cart.json # 每项变换
jq 'sort_by(.age) | reverse' users.json # 按字段排序
jq 'group_by(.dept) | map({dept: .[0].dept, n: length})' emp.json # 分组计数
map对数组每项做变换,sort_by按字段排序,group_by分组——这三件套足以替代一整段 Python 来处理接口返回的列表。最后一条group_by+map(length)就是"按部门统计人数",对应 awk 的a[$1]++。
四、格式化与调试
jq . data.json # 美化(缩进)输出,看结构神器
jq -c '.users[]' data.json # -c 压缩成单行,每行一个对象(便于管道)
jq '. | keys' obj.json # 取对象的键列表
echo '...' | jq 'has("x")' # 判断某字段是否存在拿到一团压平的 JSON,先
jq .美化一下看清层级,再写取值表达式——这是标准工作流。-c(compact)把每个结果压成一行,配合while read或 xargs 逐条处理很方便。
五、和 curl 配合
curl -s https://api.example.com/users | jq -r '.[] | "\(.id)\t\(.name)"'
curl -s url | jq '.status' # 取状态码字段判断curl 负责把 JSON 拉下来,
jq负责解析——这套组合是接口巡检、CI 校验的标配(见 curl 详解)。-r让输出是纯文本,方便拼进 shell 变量或下游命令。
六、实战:从接口响应提取并统计
# 拉一批订单,统计各状态数量
curl -s https://api.example.com/orders | \
jq -r '.orders[] | .status' | sort | uniq -c
# 取失败订单的 id 列表,逗号拼接
curl -s url | jq -r '.orders[] | select(.status=="fail") | .id' | paste -sd,第一条 jq 抽状态字段 → sort | uniq -c 计数(同 grep 实战 的聚合思路);第二条 select 过滤失败项、paste -sd, 拼成逗号串。全程零脚本,一行流水线搞定。
一句话总结
jq = 命令行 JSON 处理器(JSON 界的 awk):. 取值、[] 展开数组、select 过滤、map/sort_by/group_by 做变换与分组、{} 重组结构、-r 输出纯文本、jq . 美化看结构;与 curl 组合解析接口、配合 sort/uniq 统计,是处理 API JSON 的标准流水线,比正则抠字符串稳得多。