HOME> 转生系统> Linux jq命令完全指南:从安装到JSON处理实战

Linux jq命令完全指南:从安装到JSON处理实战

转生系统 2026-01-21 19:53:58

🌟 一、简介

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数据流!

华为荣耀手机10充电是多少瓦的,并且三种图标是什么意思?
铁森林风云