用 jq 入门:终端里处理 JSON 的利器

举报
yd_225636183 发表于 2026/11/03 09:05:33 2026/11/03
【摘要】 用 jq 入门:终端里处理 JSON 的利器 为什么需要 jq调接口、查日志、写脚本的时候,我们经常拿到一坨 JSON:可能是 curl 返回的接口数据,也可能是某个工具导出的配置文件。直接看原始输出,常常是一行挤在一起的长串,或者缩进混乱,找一个字段要翻半天。Python 当然能解析 JSON,但为看一个字段专门写脚本,未免小题大做。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 .。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。