jq 完整使用指南:从零上手指令行 JSON 处理,5 分钟跑通第一个实战
jq 完整使用指南:从零上手指令行 JSON 处理,5 分钟跑通第一个实战
【免费下载链接】jqCommand-line JSON processor项目地址: https://gitcode.com/GitHub_Trending/jq/jq
jq 是一款轻量级、跨平台的命令行 JSON 处理器,专为结构化数据设计。它用可移植的 C 语言编写,零运行时依赖,能让你像使用 sed、awk、grep 一样对 JSON 数据做切片、过滤、映射和转换。无论是解析 API 响应、清洗配置文件还是处理日志,jq 都能帮你省掉手写解析代码的大量时间。
为什么 jq 值得装进你的终端
在动手之前,先花 30 秒看看它凭什么成为命令行里处理 JSON 的事实标准:
- 零运行时依赖,单文件即用。jq 编译后就是一个独立可执行程序,不需要安装任何运行时环境,拷到服务器、容器、树莓派上都能直接跑,省去了"环境装不对"的麻烦。
- 管道语法,一学就会。你如果用过 grep 或 awk,jq 的表达方式会让你毫无陌生感:
|把表达式串起来,数据从左往右流动,5 分钟就能写出第一条实用命令。 - 内置函数库开箱即用。
map、select、group_by、sort_by、walk这些高频操作全部内置(可以直接在 src/builtin.jq 里读到它们的实现),不用现写循环。 - 美化输出 + 顺手验证。
jq '.'一行就能把压缩成一坨的 JSON 格式化成人能读的样子,还顺带帮你检查 JSON 语法是否合法。
那么,具体怎么用?下面按真实场景带你走一遍。
快速上手:5 分钟跑通你的第一条 jq 命令
第一步:安装 jq
按你的环境选一种方式,一次搞定:
# Ubuntu / Debian sudo apt update && sudo apt install jq # macOS brew install jq # Windows(任选其一) choco install jq # 或 scoop install jqWindows 用户也可以直接下载预编译的.exe文件,改名为jq.exe后加入系统 PATH 即可。如果你需要定制编译(比如关闭正则引擎),可以从源码构建:
# 从源码编译(高级用户) git clone https://gitcode.com/GitHub_Trending/jq/jq cd jq git submodule update --init autoreconf -i ./configure --with-oniguruma=builtin make -j8 sudo make install第二步:验证安装
在终端执行下面的命令,看到版本号说明安装成功:
jq --version第三步:写出第一条 jq 表达式
把一段 JSON 通过管道传给 jq,用.name提取字段。echo负责把示例数据喂给 jq,'.'是 jq 最简单的表达式,表示"原样输出":
echo '{"name": "jq", "version": "1.8", "tags": ["json", "cli"]}' | jq '.'预期输出(jq 会自动加上缩进和换行,即"美化输出"):
{ "name": "jq", "version": "1.8", "tags": ["json", "cli"] }再试一条真正干活的——只取name的值:
echo '{"name": "jq", "version": "1.8"}' | jq '.name'输出带引号的字符串"jq"。加上-r(raw output,原始输出)参数就能去掉引号,直接得到纯文本jq——这在拼接 shell 命令时特别好用。
恭喜,你已经跑通了 jq 的核心工作流:数据进管道 → 写表达式 → 拿到结果。
场景实战:三个高频用法
场景一:一键美化并提取 API 返回的 JSON
痛点:curl调用接口返回的 JSON 常常挤在一行里,关键信息淹没在几十个字段中,肉眼找值非常痛苦。
做法:把响应直接管道给 jq,用"点路径"(.a.b表示取对象 a 下的 b 字段)精确定位。假设接口返回了最近 5 条提交记录(jq 官方教程 docs/content/tutorial/default.yml 也是这么教的),你只关心每条的提交者和信息:
curl -s 'https://example.com/api/commits?per_page=5' \ | jq '.[] | {author: .commit.author.name, message: .commit.message}'.[]遍历数组里的每个元素,{...}现场组装一个只含你要的新对象。
效果:原本几百行的原始响应,变成 5 行整洁的"提交者 + 信息"摘要,一眼看完。
场景二:从用户列表里筛出符合条件的数据
痛点:拿到一份几百人的 JSON 用户数组,想知道"哪些人是活跃状态",手动翻文件不现实,写 Python 脚本又太重。
做法:select是 jq 的过滤器,select(条件)表示"只放行满足条件的元素"。假设users.json长这样:
[ {"name": "Alice", "status": "active"}, {"name": "Bob", "status": "inactive"}, {"name": "Carol", "status": "active"} ]筛出活跃用户并只保留名字:
jq '.[] | select(.status == "active") | .name' users.json预期输出:
"Alice" "Carol"如果还想按名字排序后取前 3 名,把sort_by和first/索引组合起来即可,整条管道依然一行读完。
效果:过滤 + 字段裁剪 + 排序,全部在一条命令里完成,结果可以直接再管道给wc -l、xargs等其它工具。
场景三:清洗嵌套配置,只留你需要的字段
痛点:日志或配置里嵌套了三层对象,你只需要最里面的两三个值;或者反过来,想把嵌套对象拍平成好检索的结构。
做法:pick函数(实现在 src/builtin.jq)可以按路径"白名单式"地只保留指定字段;del则是它的反面,用来删字段。比如从配置对象里只留database和port:
jq 'pick(.database, .port)' config.json想删掉某个敏感字段再输出,用:
jq 'del(.password)' config.json对于"嵌套太深、懒得一层层写路径"的情况,walk(变换)会把表达式递归应用到每一层,配合map就能做整树改造,例如把所有空字符串统一转成 null:
jq 'walk(if . == "" then null else . end)' config.json效果:脏数据进、干净数据出,而且不用写任何临时脚本文件。
进阶技巧:榨干 jq 的能力
- 自定义函数
def。写过的逻辑可以封装成函数复用,例如def active: select(.status == "active");,之后直接jq '.[] | active'即可。 - 变量
$x。用as $x把中间结果存起来,避免重复计算:.[] as $user | .name, $user.email。 - 正则三件套:
test("...")判断是否匹配、match取匹配位置、capture直接按命名分组提取成对象,处理"JSON 里套了个字符串需要再拆"的场景很顺手。 - 多文件合并。
jq -s(slurp,全部读入)会把管道里的所有 JSON 值收集成一个大数组,jq -s 'add'可以一行求总和。 - 模块化组织。复杂的 jq 程序可以拆成模块文件,用
module {version: 1.7};声明版本(可以参考仓库里 tests/modules/a.jq 的写法),便于团队协作复用。 - 调试利器
debug。表达式中间加| debug("msg:")会把中间值打到标准错误输出,排查"到底哪一步输出错了"时非常高效。
常见问题与避坑指南
1.Cannot index object with string "xxx"报错怎么办?
这是新手最高频的坑:jq 尝试访问一个不存在的键。两种解法——要么确认字段名拼写正确,要么给路径加?(安全导航,取不到时安静地返回空而不报错):
jq '.user.email?' profile.json2. 字符串输出为什么总带引号?
jq 严格区分"JSON 字符串"和"纯文本",默认输出遵循 JSON 规范。想要裸文本就加-r;反过来想压缩成一行(方便存库或传参),加-c:
jq -c '.[0]' data.json3. Windows 下jq不是可识别的命令?
先确认改名为jq.exe的目录已加入 PATH,重开一个终端再试。另外注意 shell 引号差异:CMD 和 PowerShell 里对单双引号的处理不同,遇到表达式解析报错时,优先把整个 jq 程序用单引号包住。
4. 输入不是单个对象而是多行多个 JSON 值?
jq 默认按"JSON 流"逐个处理,这正是它设计上的优势:不需要先合并,jq '...'对每个值分别执行表达式。想强制收集成数组再处理时,用-s。
5. 数字精度被改动?
jq 默认用十进制浮点显示数字,超长精度数字可能看起来"变了"。这属于显示层面行为,对绝大多数运维和数据场景无影响;遇到极端精度需求时查阅 docs/content/manual/ 中的数字相关章节。
延伸学习资源
- 官方手册:仓库内按版本组织的完整手册 docs/content/manual/manual.yml,从基础语法到函数参考一应俱全。
- 内置函数源码:src/builtin.jq 里的每个
def都配了注释,是最好的"函数用法定"教材,看不懂某个函数行为时直接读实现。 - 官方教程:docs/content/tutorial/default.yml 以真实 API 数据为素材,从美化输出讲到路径提取,是第二篇必读内容。
- 测试套件:tests/jq.test 用"程序 / 输入 / 预期输出"三行一组的格式覆盖了数百个边界用例(BOM 头、Unicode 转义、浮点等),想搞懂 jq 行为边界时可以照着做实验。
- 社区支持:遇到怪问题,Stack Overflow 的
jq标签和官方 Discord 社区是问人最快的地方。
一句话总结
jq 就是你终端里的 JSON 瑞士军刀:装一次,到处用,一行命令顶一段脚本。
现在就打开终端,把最近收到的一份 JSON 数据丢进管道,用你的第一条jq命令处理它——你会发现,数据清洗这件事从未如此轻松。
【免费下载链接】jqCommand-line JSON processor项目地址: https://gitcode.com/GitHub_Trending/jq/jq
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
