深入理解 `jq`:命令行处理 JSON 的利器

深入理解 jq:命令行处理 JSON 的利器

1. 引言

在处理 API 返回的数据、日志文件或自动化脚本时,我们常常会遇到结构化的 JSON 数据。jq 是一个轻量级、灵活而强大的命令行 JSON 处理工具,它就像是 sedawk,但专门用于 JSON。

本篇文章将深入讲解 jq 的基本用法、常见场景、进阶语法以及组合命令示例,帮助你在终端下轻松处理复杂的 JSON 数据。


2. 安装 jq

Linux

大多数 Linux 发行版都可通过包管理器安装:

# Debian/Ubuntu
sudo apt install jq

# CentOS/RHEL
sudo yum install jq

macOS

brew install jq

Windows

choco install jq

3. 基本语法结构

cat file.json | jq '<过滤器>'

或直接处理命令输出:

curl -s https://api.example.com/data | jq '<过滤器>'

4. 常见用法示例

读取键值

jq '.name' data.json

读取嵌套值

jq '.user.profile.age' data.json

提取数组元素

jq '.users[0].name' data.json

遍历数组并提取字段

jq '.users[] | .id' data.json

5. 实用技巧

输出压缩 JSON(单行)

jq -c '.' data.json

获取多个字段(对象构造)

jq '{name: .name, age: .profile.age}' data.json

使用变量(bash 中传参)

name="Alice"
jq --arg name "$name" '.users[] | select(.name == $name)' data.json

过滤数组条件

jq '.users[] | select(.age > 25)' data.json

6. 高级用法

修改字段值

jq '.user.age = 30' data.json

删除字段

jq 'del(.password)' data.json

合并两个 JSON 文件

jq -s '.[0] + .[1]' file1.json file2.json

使用 jq 解析多层 JSON 并格式化输出

jq -r '.users[] | "\(.id): \(.name) - \(.email)"' data.json

7. 与 curl 配合使用

将 REST API 的 JSON 响应格式化、美化:

curl -s https://api.example.com/data | jq .

提取返回中的 token:

curl -s https://api.example.com/login | jq -r '.token'

组合 POST 请求与处理:

curl -s -X POST -H "Content-Type: application/json" \
    -d '{"username":"admin","password":"123"}' \
    https://api.example.com/login | jq -r '.token'

8. 常用过滤器和运算符速查表

表达式 说明
. 当前对象
.key 获取键
[] 数组元素
| 管道(连接多个操作)
select(expr) 选择符合条件的项
map(expr) 对数组每一项应用操作
length 获取数组或字符串长度
keys 返回对象所有键的数组

9. 常见实用场景示例

示例 1:提取 IP 地址

curl -s https://api.ipify.org?format=json | jq -r '.ip'

示例 2:过滤 Kubernetes Pod 状态

kubectl get pods -o json | jq '.items[] | {name: .metadata.name, status: .status.phase}'

示例 3:从 JSON 中生成 curl 命令

cat apis.json | jq -r '.endpoints[] | "curl -X GET " + .url'

10. 总结

  • jq 是处理 JSON 数据的命令行利器,功能非常强大。
  • 它在调试 API、自动化脚本、日志处理和 DevOps 场景中都有广泛用途。
  • 掌握 jq 可以显著提升终端数据处理效率。

11. 参考资料


posted @ 2025-05-14 22:44  雨中遐想  阅读(162)  评论(0)    收藏  举报