🌟 一、简介
jq 是一款轻量级命令行JSON处理器,专为高效解析、过滤、转换和格式化JSON数据而设计。它支持复杂查询、条件过滤、数学运算及自定义函数,可无缝集成到Shell脚本中处理API响应、日志文件或配置文件。其优势包括:
- 流式处理:逐行解析大文件,内存占用低;
- 跨平台:支持Linux/macOS/Windows(通过WSL);
- 类Sed语法:提供类似sed/awk的操作体验,简化JSON处理流程。
💡 适用场景:API数据提取、日志分析、配置修改、数据格式转换等。
🔧 二、安装方法
1. 常见系统安装
-
Debian/Ubuntu:
Bashsudo apt-get update && sudo apt-get install jq -
CentOS/RHEL:
Bashsudo yum install epel-release && sudo yum install jq -
macOS:
Bashbrew install jq
2. 麒麟V10系统安装
麒麟系统(基于Debian或Fedora)可通过以下方式安装:
Bash# 使用APT(Debian系麒麟) sudo apt-get update sudo apt-get install jq # 使用YUM(Fedora系麒麟) sudo yum install jq # 或源码编译安装(通用) git clone https://github.com/stedolan/jq.git cd jq ./configure make sudo make install
3. 二进制直装(无root权限)
Bashwget https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 -O ~/bin/jq chmod +x ~/bin/jq
📖 三、基础语法与常用选项
命令结构:jq [选项] '过滤器' [文件]
🔍 核心选项
| 选项 | 作用 | 示例 |
|---|---|---|
| -r | 输出原始字符串(去引号) | jq -r '.name' |
| -c | 紧凑输出(无格式化空格) | jq -c '.' |
| -s | 合并多行输入为数组 | jq -s '.[]' |
| --arg | 传递外部变量 | `jq --arg n "Alice" '.users[] |
🔑 基础过滤器
- 字段提取:.key(如 .users[0].name)
- 数组遍历:.[](如 .[].id)
- 条件过滤:select(条件)(如 select(.age > 30))
- 数据转换:map(操作)(如 map(.age * 2))
🛠️ 四、常用过滤器详解
1. 数据查询与格式化
Bash# 美化输出JSON echo '{"name":"Alice","age":30}' | jq '.' # 输出: { "name": "Alice", "age": 30 } # 提取嵌套字段 echo '{"user": {"address": {"city": "Beijing"}}}' | jq '.user.address.city' # 输出:"Beijing"
2. 条件过滤与逻辑运算
Bash# 筛选年龄>25且城市为北京的用户 jq '.[] | select(.age > 25 and .city == "Beijing")' data.json # 条件分支(if-else) echo '30' | jq 'if . > 18 then "Adult" else "Child" end' # 输出:"Adult"
3. 数组操作
Bash# 提取所有用户名并转为数组 jq '[.users[].name]' data.json # 输出:["Alice", "Bob", "Charlie"] # 按年龄降序排序后取前2名 jq 'sort_by(.age) | reverse | .[:2]' data.json
4. 数据修改与重构
Bash# 新增字段 jq '.[] | .country = "China"' data.json # 删除字段 jq 'del(.[].city)' data.json # 重命名字段 jq '{fullName: .name, years: .age}' data.json
5. 字符串与数学运算
Bash# 拼接字符串 jq '"User: \(.name), Age: \(.age)"' data.json # 计算UID总和 jq '[.users[].uid] | add' data.json
🚀 五、高级实战示例
1. API数据处理
Bash# 提取GitHub仓库的star与fork数 curl -s https://api.github.com/repos/stedolan/jq | \ jq '{name: .name, stars: .stargazers_count, forks: .forks}'
2. 日志分析
Bash# 过滤ERROR级别日志并转CSV cat logs.json | jq -r 'select(.level=="ERROR") | [.timestamp, .message] | @csv'
3. 配置批量修改
Bash# 更新Docker容器的重启策略 docker inspect nginx | jq '.[0].HostConfig.RestartPolicy.Name = "always"' | docker update nginx
4. 大文件流式处理
Bash# 解析GB级JSON(避免内存溢出) jq --stream 'select(.[0][-1] == "error")' massive.log
💡 六、性能优化技巧
-
逐行处理NDJSON:
Bashjq -c '.users[]' data.ndjson > filtered.ndjson -
并行加速:
Bashparallel -k jq '.users[{}]' data.json ::: {0..10} -
避免重复解析:使用变量缓存中间结果:
Bashjq '.users as $u | $u | map(.name)' data.json
🧩 七、常见问题解决
-
Q1:输出含转义字符 → 用 -r 输出原始字符串:
Bashjq -r '.users[0].name' -
Q2:处理非标准JSON → 用 -n 自动修复:
Bashecho '{"name": "test", "value": 123' | jq -n 'input' -
Q3:调试复杂查询 → 启用 --debug 分步检查:
Bashjq '.users | map(.name)' --debug
🔚 结语
jq 是Linux下处理JSON的瑞士军刀🔧,通过组合基础过滤器和高级函数,可应对从简单字段提取到复杂数据重构的全场景需求。本文涵盖的安装指南、语法详解及实战案例,助你高效驾驭JSON数据流!