返回

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

🌟 一、简介

jq 是一款轻量级命令行JSON处理器,专为高效解析、过滤、转换和格式化JSON数据而设计。它支持复杂查询、条件过滤、数学运算及自定义函数,可无缝集成到Shell脚本中处理API响应、日志文件或配置文件。其优势包括:

  • 流式处理:逐行解析大文件,内存占用低;
  • 跨平台:支持Linux/macOS/Windows(通过WSL);
  • 类Sed语法:提供类似sed/awk的操作体验,简化JSON处理流程。

💡 适用场景:API数据提取、日志分析、配置修改、数据格式转换等。


🔧 二、安装方法

1. 常见系统安装

  • Debian/Ubuntu

    Bash
    sudo apt-get update && sudo apt-get install jq  
  • CentOS/RHEL

    Bash
    sudo yum install epel-release && sudo yum install jq  
  • macOS

    Bash
    brew 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权限)

Bash
wget 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  

💡 六、性能优化技巧

  1. 逐行处理NDJSON

    Bash
    jq -c '.users[]' data.ndjson > filtered.ndjson  
  2. 并行加速

    Bash
    parallel -k jq '.users[{}]' data.json ::: {0..10}  
  3. 避免重复解析:使用变量缓存中间结果:

    Bash
    jq '.users as $u | $u | map(.name)' data.json  

🧩 七、常见问题解决

  • Q1:输出含转义字符 → 用 -r 输出原始字符串:

    Bash
    jq -r '.users[0].name'  
  • Q2:处理非标准JSON → 用 -n 自动修复:

    Bash
    echo '{"name": "test", "value": 123' | jq -n 'input'  
  • Q3:调试复杂查询 → 启用 --debug 分步检查:

    Bash
    jq '.users | map(.name)' --debug  

🔚 结语

jq 是Linux下处理JSON的瑞士军刀🔧,通过组合基础过滤器和高级函数,可应对从简单字段提取到复杂数据重构的全场景需求。本文涵盖的安装指南、语法详解及实战案例,助你高效驾驭JSON数据流!

首页分类标签