用 jq 入门:终端里处理 JSON 的利器
用 jq 入门:终端里处理 JSON 的利器
为什么需要 jq
调接口、查日志、写脚本的时候,我们经常拿到一坨 JSON:可能是 curl 返回的接口数据,也可能是某个工具导出的配置文件。直接看原始输出,常常是一行挤在一起的长串,或者缩进混乱,找一个字段要翻半天。Python 当然能解析 JSON,但为看一个字段专门写脚本,未免小题大做。
jq 就是干这一件事的终端工具:读 JSON、取字段、过滤、重组,全部用一行命令完成。它几乎在所有发行版的软件源里都有,装好就能用,不需要启动任何服务。
第一次使用:格式化输出
先从最简单的开始。假设接口返回了这样的数据,存在 user.json 里:
{"name": "zhangsan", "age": 28, "tags": ["python", "docker"]}
直接看文件是一行,而 jq 会把它格式化成易读的样子:
jq . user.json
. 的意思是“整个输入原样输出”,只不过 jq 顺手做了漂亮排版。这一步本身就很实用:拿到一团乱的 JSON,先 jq . 看清楚结构,再谈取字段。
取字段:点号就是路径
知道了结构,取字段就是沿着路径往下点:
jq .name user.json
jq .tags[0] user.json
第一个命令输出 "zhangsan",第二个输出 "python"。数组下标从 0 开始,和大多数编程语言一致。如果字段名里有特殊字符,可以用 ."field-name" 这种写法。
如果只想拿到不带引号的纯文本,加上 -r 参数:
jq -r .name user.json
这在脚本里特别有用:取出来的值可以直接赋值给变量、拼进下一条命令,不用再手动去引号。
管道:先过滤,再加工
jq 真正的威力在管道上。假设接口返回了一个用户列表,只想看每个人的名字:
curl -s https://api.example.com/users | jq -r '.[].name'
[] 表示遍历数组,.name 取每个元素的姓名字段,-r 去引号。结果就是一列干净的名字,可以直接喂给 while read 或者存进文件。
再进一步,还能边过滤边筛选。比如只看年龄大于 25 的用户:
jq '.[] | select(.age > 25) | .name' users.json
这里的 | 和 Shell 管道是一个意思:把上一步的结果交给下一步处理。select 是过滤器,只保留满足条件的元素。组合起来,jq 就成了一个迷你的 JSON 查询语言。
几个日常高频用法
第一,验证 JSON 是否合法。文件太大、怀疑缺了括号时,跑一遍 jq . file.json:能正常输出就是合法,报错会直接指出位置,比肉眼找括号快得多。
第二,只看部分结构。接口返回几十个字段、只关心其中两三个时,用对象构造语法重组:
jq '{name: .name, tags: .tags}' user.json
输出就只剩这两个字段,清爽很多,写报告、贴到文档里都方便。
第三,配合 Shell 脚本批量处理。日志文件里每行一个 JSON 对象时,用 -c 让每条结果保持紧凑的一行,再用 Shell 逐行处理;或者用 jq -s 把多行先聚合成数组,统一做统计。
小结
jq 的学习曲线很平缓:先记住 jq . 格式化、.字段 取值、-r 去引号,就能解决八成日常需求;等熟练了,再用管道和 select 做过滤组合。它的定位很清楚:不替代 Python 处理复杂逻辑,只在“快速看一眼、快速取一个字段”这个场景里做到最省事。下次 curl 回来一坨 JSON,别急着写脚本,先试试 jq .。
- 点赞
- 收藏
- 关注作者
评论(0)