Linux jq命令完全指南:从安装到JSON处理实战
🌟 一、简介
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数据流!