Linux命令行JSON处理器 jq 格式化输出json文件

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

七、常用参数速查表

表格

参数作用
.原样输出,格式化美化
-rraw 输出,字符串不带双引号,脚本变量取值
-ccompact,压缩为单行 json
-Ssort-keys,按键排序输出
-C强制彩色输出(管道给 less 时用 `jq -C . file.jsonless -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

九、常见坑

  1. jq '.' file.json > file.json 文件清空

shell 会先创建输出文件,再执行 jq,原文件被覆盖。必须用临时文件中转。

  1. JSON 语法本身报错 parse error

不是 jq 问题,json 文件本身有语法错误(少逗号、引号不匹配)

  1. 字段名带横杠 / 空格,要用双引号:jq '."app-name"' data.json
  2. 中文显示 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
喜欢就支持一下吧
点赞15 分享
评论 抢沙发
头像-次元社
欢迎您留下宝贵的见解!
提交
头像-次元社

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容