jq 命令

1. 基本介绍

jq 是一个轻量级且灵活的命令行工具,用于处理 JSON 数据。它允许用户过滤、转换、格式化和查询 JSON 数据,是开发人员和系统管理员处理 JSON 数据的强大工具。

2. 基本语法

bash
jq [选项] 过滤器 [文件...]

3. 常用选项

选项 描述
-c, --compact-output 紧凑输出,每个 JSON 对象占一行
-n, --null-input 不读取输入,从空输入开始
-s, --slurp 将所有输入读取到一个数组中
-r, --raw-output 输出原始字符串,不包含 JSON 引号
-R, --raw-input 将输入作为原始字符串处理,不解析为 JSON
-C, --color-output 彩色输出
-M, --monochrome-output 单色输出
-e, --exit-status 根据输出设置退出状态码
-S, --sort-keys 按字母顺序排序输出的键
-r, --raw-output 输出原始字符串,不包含 JSON 引号
-h, --help 显示帮助信息
-V, --version 显示版本信息

4. 常见用法示例

4.1 基本过滤

bash
# 格式化 JSON 输出
cat data.json | jq .

# 紧凑输出
cat data.json | jq -c .

# 获取特定字段
cat data.json | jq '.name'

# 获取嵌套字段
cat data.json | jq '.user.name'

# 获取数组元素
cat data.json | jq '.users[0]'

# 获取数组中的特定字段
cat data.json | jq '.users[].name'

4.2 数组操作

bash
# 获取数组长度
cat data.json | jq '.users | length'

# 过滤数组元素
cat data.json | jq '.users[] | select(.age > 30)'

# 映射数组元素
cat data.json | jq '.users[] | {name: .name, age: .age}'

# 排序数组
cat data.json | jq '.users | sort_by(.age)'

# 反向排序数组
cat data.json | jq '.users | sort_by(.age) | reverse'

# 合并数组
cat data1.json | jq -s 'add'

4.3 对象操作

bash
# 添加新字段
cat data.json | jq '. + {new_field: "value"}'

# 更新现有字段
cat data.json | jq '.name = "new_name"'

# 删除字段
cat data.json | jq 'del(.field_to_remove)'

# 合并对象
cat data1.json data2.json | jq -s '.[0] * .[1]'

# 提取对象键
cat data.json | jq 'keys'

# 提取对象值
cat data.json | jq 'values'

4.4 条件判断

bash
# 基本条件
cat data.json | jq 'if .age > 30 then "old" else "young" end'

# 条件过滤
cat data.json | jq '.users[] | if .age > 30 then .name else empty end'

# 三元表达式
cat data.json | jq '.age > 30 ? "old" : "young"'

4.5 字符串操作

bash
# 字符串长度
cat data.json | jq '.name | length'

# 字符串拼接
cat data.json | jq '.first_name + " " + .last_name'

# 字符串切片
cat data.json | jq '.name[0:3]'

# 转换为大写
cat data.json | jq '.name | ascii_upcase'

# 转换为小写
cat data.json | jq '.name | ascii_downcase'

# 字符串替换
cat data.json | jq '.name | sub("old"; "new")'

4.6 数值操作

bash
# 数值运算
cat data.json | jq '.age + 10'
cat data.json | jq '.price * 1.1'
cat data.json | jq '.quantity / 2'
cat data.json | jq '.score % 10'

# 数学函数
cat data.json | jq '.number | floor'
cat data.json | jq '.number | ceil'
cat data.json | jq '.number | round'
cat data.json | jq '.number | sqrt'
cat data.json | jq '.number | abs'

4.7 与其他命令结合使用

bash
# 从 API 获取 JSON 并格式化
curl -s https://api.example.com/users | jq .

# 从日志文件中提取 JSON 并过滤
grep -E '\{.*\}' log.txt | jq '.error'

# 计算 JSON 数据中的统计信息
cat data.json | jq '.users | map(.age) | add / length'

# 批量处理 JSON 文件
for file in *.json; do jq '.name' "$file"; done

5. 高级用法

5.1 自定义函数

bash
# 定义和使用自定义函数
cat data.json | jq 'def greet: "Hello, " + .name + "!"; greet'

# 带参数的自定义函数
cat data.json | jq 'def add(x): . + x; .age | add(10)'

5.2 递归操作

bash
# 递归遍历所有字段
cat data.json | jq '..'

# 递归查找特定值
cat data.json | jq '.. | select(type == "string" and contains("error"))'

5.3 正则表达式

bash
# 使用正则表达式匹配
cat data.json | jq '.email | test("@example\.com")'

# 正则表达式替换
cat data.json | jq '.email | sub("@example\.com"; "@newdomain.com")'

# 全局替换
cat data.json | jq '.text | gsub("old"; "new")'

5.4 生成 JSON

bash
# 生成简单 JSON 对象
jq -n '{name: "John", age: 30}'

# 从环境变量生成 JSON
jq -n --arg name "$USER" '{username: $name}'

# 生成数组
jq -n '[1, 2, 3, 4, 5]'

6. 总结

jq 是一个功能强大的 JSON 处理工具,它提供了丰富的过滤和转换功能,可以帮助用户快速处理和分析 JSON 数据。通过掌握其基本语法和常用过滤器,用户可以轻松应对各种 JSON 处理任务。

最后更新:2026-02-05