Linux jq 命令 JSON 处理器完整教程(格式化、提取、过滤、修改 JSON)
jq 是 Linux 命令行专门处理 JSON 的工具,最常用功能:压缩的一行 JSON 一键美化格式化,还能提取字段、遍历数组、过滤数据、修改 JSON,适合处理接口返回、docker 输出、日志里的 JSON。
一、安装 jq
# CentOS7 / RHEL
yum install jq -y
# Ubuntu/Debian
apt install jq -y
验证安装
jq --version
二、核心:JSON 格式化美化(最常用)
. 是 jq 基础过滤器,代表原样输出,自动缩进美化 JSON腾讯云
1. 直接打印美化到屏幕
jq '.' data.json
- 适合看压缩的单行 json(比如 curl 返回、日志 json)
- 管道方式:curl 获取接口直接格式化
curl -s http://xxx/api | jq '.'
2. 格式化,输出保存到新文件(推荐,不破坏原文件)
jq '.' messy.json > pretty.json
3. 原地覆盖原文件(⚠️不要直接 > 原文件,会清空!)
❌错误写法:
jq '.' data.json > data.json会直接清空文件! ✅正确原地覆盖:输出到临时文件再替换
jq '.' data.json > tmp.json && mv tmp.json data.json
4. 常用美化参数
# -S 按键名排序输出(方便对比配置)
jq -S '.' data.json
# -c 紧凑压缩输出(美化反过来,多行json压缩成单行)
jq -c '.' data.json
# -r raw输出:字符串去掉双引号,输出纯文本(脚本取值必备)
jq -r '.name' data.json
三、提取 JSON 字段(日常脚本高频)
示例 json 文件 data.json
{
"user": {
"name": "zhangsan",
"age": 25
},
"hobbies": ["coding","linux"]
}
# 提取一级字段
jq '.user' data.json
# 提取嵌套字段
jq '.user.name' data.json
# -r 去除字符串双引号,拿到纯文本
jq -r '.user.name' data.json
# 同时提取多个字段,逗号分隔
jq '.user.name, .user.age' data.json
四、数组处理
# 遍历数组,输出每一项
jq '.hobbies[]' data.json
# 取数组第0个元素(下标从0开始)
jq '.hobbies[0]' data.json
# 数组最后一个元素
jq '.hobbies[-1]' data.json
# 获取数组长度
jq '.hobbies | length' data.json
五、条件过滤 select ()(筛选数组数据)
示例 users.json
[
{"name":"a","status":1},
{"name":"b","status":0}
]
# 筛选 status=1 的用户
jq '.[] | select(.status == 1)' users.json
六、修改 JSON 字段,输出新 JSON
jq 默认不会修改原文件,只输出处理后的结果,需要重定向保存
# 修改name字段值
jq '.user.name = "lisi"' data.json
# 新增字段
jq '.user.email = "test@demo.com"' data.json
# 删除字段
jq 'del(.user.age)' data.json
保存修改结果:
jq '.user.name = "lisi"' data.json > new_data.json
七、常用参数速查表
表格
| 参数 | 作用 | |
|---|---|---|
. | 原样输出,格式化美化 | |
-r | raw 输出,字符串不带双引号,脚本变量取值 | |
-c | compact,压缩为单行 json | |
-S | sort-keys,按键排序输出 | |
-C | 强制彩色输出(管道给 less 时用 `jq -C . file.json | less -R`) |
-M | 关闭彩色 | |
-s | 把多个 json 行,读取为一个数组 |
八、实战场景示例
场景 1:查看 docker inspect 输出(docker 返回大段 JSON,jq 格式化)
docker inspect 容器ID | jq '.'
# 直接提取容器IP
docker inspect 容器ID | jq -r '.[0].NetworkSettings.IPAddress'
场景 2:批量处理多个 json 文件(shell 循环)
for f in *.json;do
jq -S . "$f" > tmp.json && mv tmp.json "$f"
done
场景 3:JSON 转 CSV 导出
jq -r '.[] | [.name,.age] | @csv' data.json > out.csv
九、常见坑
jq '.' file.json > file.json文件清空
shell 会先创建输出文件,再执行 jq,原文件被覆盖。必须用临时文件中转。
- JSON 语法本身报错
parse error
不是 jq 问题,json 文件本身有语法错误(少逗号、引号不匹配)
- 字段名带横杠 / 空格,要用双引号:
jq '."app-name"' data.json - 中文显示 unicode 转义:加
-a参数开启 ascii 转义,不加默认正常中文
十、备选:服务器没有 jq 时,用 Python 一键格式化 json(无需安装)
python3 -m json.tool data.json
十一、学习推荐小练习
新建 test.json,复制下面内容,试格式化、提取 name、过滤 status
[
{"id":1,"name":"mysql","port":3306},
{"id":2,"name":"deepseek","port":11434}
]
# 美化
jq '.' test.json
# 提取所有name
jq -r '.[].name' test.json
# 筛选port=11434
jq '.[] | select(.port == 11434)' test.json
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END











暂无评论内容