首页/系统/Linux 运维命令速查/jq 解析与提取 JSON
文本处理77 条

jq 解析与提取 JSON

命令行 JSON 处理器:. 原样格式化、-r 输出裸字符串、-c 紧凑单行、select 过滤、管道串联取深层字段,接口调试必备。

Linux 运维命令速查系统更新于 2026-10-13

jq 是什么

jq 是命令行里的 JSON 处理器:点号取字段、方括号取数组元素、管道串联多个步骤,再加 select、map 这类函数做过滤与变形。它把结构化数据从「一堆文本」还原成可精确寻址的对象,比用 cut、awk 按位置切字符串稳得多。接口调试、云平台命令行输出提取、日志里的 JSON 字段分析,都靠它。

基本信息

适用平台Linux、macOS、Windows 均可安装,发行版仓库里通常有 jq 包
命令语法jq [选项] 过滤器 [文件...]
常用选项-r 输出裸字符串 / -c 紧凑单行 / -e 按结果给退出码 / -n 不读输入 / -s 把输入读成数组 / --arg 传入变量
核心过滤器. 原样、.a.b 路径取值、.[] 遍历数组、select 过滤、map 映射、length 长度、keys 键列表

典型使用场景

  • 接口调试:把一行 JSON 展开成缩进格式,看清结构
  • 字段提取:从云平台命令行的输出里取 id、地址之类的值
  • 条件筛选:只保留状态为 active 的条目
  • 改写配置:对 JSON 配置做增量修改再写回
  • 日志分析:把每行 JSON 日志抽成需要的列

常用示例

常用示例
curl -s https://api.example.com/status | jq .
curl -s https://api.example.com/status | jq -r '.data.host'
jq -r '.items[] | select(.status=="active") | .name' data.json
jq -c '{name, port}' conf.json > tmp.json && mv tmp.json conf.json
jq '.port = 8080' conf.json | sponge conf.json    # 就地修改,需 moreutils
jq -r --arg env prod '.services[] | select(.env==$env) | .name' cfg.json

常用过滤器

过滤器作用示例
.原样输出并格式化jq .
.a.b按键路径取值jq .data.host
. []遍历数组元素jq '.items[]'
select(条件)只保留满足条件的元素select(.status=="active")
map(表达式)对每个元素做变换map(.name)
length数组或对象的长度jq '.items | length'
keys取对象的键列表jq 'keys'
键名含连字符或特殊字符时要加引号写成 .data["build-id"];写成点号形式会被解析成减法表达式,得到报错或意外结果。
超过 2 的 53 次方的大整数会按浮点处理而丢精度。需要原样保留时把它按字符串取出来,不要让它参与数值运算。

输出与判断相关选项

选项作用场景
-r字符串不加引号输出拼进 shell 或写入配置
-c每个结果压成一行逐行处理与落盘
-S对象键排序两份 JSON 做 diff
-e按结果真假设置退出码脚本里做条件判断
--arg / --argjson注入外部变量拼接查询条件
取深层字段直接用路径表达式 .a.b[0].c,要遍历数组用 map(),要挑字段组装新对象用 {名称: .字段}。把结果写回原文件时一定先输出到临时文件再替换,直接重定向会先清空源文件,jq 读到的是空输入。

易错点

  • 键名含特殊字符不加引号会被当成运算,报错或得到意外结果
  • 大整数按浮点解析会丢精度,涉及长 ID 与高精度时间戳时要按字符串处理
  • 不加 -r 时字符串输出带引号,拼进 shell 命令前多余的引号会导致路径错误
  • 用重定向直接写回源文件会先截断文件,导致 jq 读到空输入;要写临时文件再替换
  • 过滤器是一段程序而不是模板,字符串插值必须放在双引号包裹的表达式里
  • 用 == null 判断键是否存在:值为 null 的键与缺失的键结果相同,要区分存在性得用 has() 或 in(),否则脚本会对「值为空」与「没有这个字段」做相同处理

数据来源与参考

  • man 1 jq(jq 1.7 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌