CLI AI

用 jq 在命令行过滤 JSON

2026-05-25

用 jq '.users[0].name' api.json 从 JSON 里取出一个值——点号是 jq 的路径语法,后面的一切(select、@csv、-r)都是同一个思路,用在过滤、转换或清理输出上。jq 处理 JSON 的方式,就像 awk 处理文本:先解析一次,再把过滤器串起来。下面这六种模式,覆盖了你盯着一个 API 响应、想取一个字段、一个过滤后的列表或一份 CSV 时会遇到的实际情况。

1. 取一个字段

clai
$ clai 从 api.json 里取出第一个用户的名字→ jq '.users[0].name' api.json"alice"

点号是 jq 里「取当前值」的过滤器,后面跟着路径。输出里的引号说明 jq 返回的是一个 JSON 字符串,不是给 shell 用的纯文本。

2. 去掉引号,方便写脚本

clai
$ clai 打印所有用户的名字,不要引号→ jq -r '.users[].name' api.jsonalicebob

-r(raw output)给出不带引号的裸字符串——如果结果要进 shell 变量或循环,这正是你要的。不加 -r,你会得到带引号的字符串,第一次比较就莫名其妙失败。

3. 按条件过滤

clai
$ clai 显示年龄超过 30 的用户名字→ jq -r '.users[] | select(.age > 30) | .name' api.jsonalice

.users[] 把数组展开成一串值,select() 只放行符合条件的。jq 内部的管道,工作方式和 shell 管道一模一样。

4. 转成 CSV

clai
$ clai 把这个转成带姓名和年龄的 csv→ jq -r '.users[] | [.name, .age] | @csv' api.json"alice",34"bob",28

把想要的字段收集进一个数组,交给 @csv。此外还有 @tsv、@base64 和 @uri。这一行就顶得上一段 Python 脚本。

5. 看懂一个陌生的 API 响应

clai
$ clai 显示顶层有哪些 key→ jq -r 'keys[]' api.jsonusers

面对别人的 JSON,这是最值得先跑的一条。接下来用 jq -r '.users[0] | keys[]' 看某个元素内部有哪些字段。

6. 直接从 curl 解析 API 响应

clai
$ clai 从 api 拿到 json,只打印 version 字段→ curl -s https://example.com/api/status | jq -r '.version'

jq 存在的意义,很大程度上就是为了这个组合。-s 关掉 curl 的进度提示——不加的话,它会混进数据流,让 jq 卡住。

常见坑

  • -r 改变的是输出,不是过滤器。 忘记加 -r,是 bash 里 "1.2.3" 这类字符串比较诡异行为的头号原因。
  • 带连字符或点的 key 需要加引号: jq '."content-type"'。不加引号,jq 会把它当成表达式去解析,然后报错。
  • jq 处理不了多个 JSON 对象拼成的流。 对于逐行 JSON(JSON Lines),加上 -s(slurp),或者逐行处理。

相关问题

怎么取数组的最后一个元素? jq '.users[-1]'。负数索引从末尾开始数。

怎么判断某个字段是否存在? 对象用 jq 'has("age")',过滤列表用 jq '.users[] | select(has("email"))'。

用 jq 还是 python -m json.tool? json.tool 只负责格式化。jq 能选取、过滤、转换——在管道里这是不同的活。

相关阅读

描述你需要的字段,CliAI 会帮你写好 jq 过滤器,连引号都不用操心。一行命令安装。