🧭 说明
jq是一个功能强大的命令行JSON处理器,能够高效地解析、过滤、查询和操作JSON数据。下面这个表格汇总了它的主要功能类别和常用命令。
| 功能类别 | 常用命令/过滤器 | 说明 |
|---|---|---|
| 基础查询 | ., .["key"], .[index] |
获取JSON数据本身、特定字段值或数组元素。 |
| 数组操作 | .[], .[index], .[start:end] |
展开数组、访问特定元素或进行切片。 |
| 数据筛选 | select(condition), map(expression) |
根据条件过滤数据,或对数组每个元素进行转换。 |
| 构造与转换 | { }, [ ], +=, del() |
创建新对象/数组,修改字段值或删除字段。 |
| 聚合计算 | length, keys, has("key"), add |
计算长度、获取键名、检查键存在性、求和等。 |
| 管道操作 | ` | ` |
💡 核心功能详解
-
格式化输出 :最基本的用法是使用
.过滤器,它可以将输入的JSON数据美观地打印出来。这在查看压缩在一行的JSON数据时特别有用。bashecho '{"name":"Alice","age":30}' | jq '.' -
提取特定字段 :通过
.fieldName可以直接获取对象中的字段值。对于嵌套结构,可以使用点号链式访问,如.user.profile.name。使用-r选项可以输出原始字符串(去掉JSON引号),方便直接在shell脚本中使用。bashecho '{"user":{"name":"Alice"}}' | jq -r '.user.name' # 输出:Alice -
操作JSON数组
-
展开迭代 :使用
.[]可以将数组展开,使其中的每个元素独立地通过后续管道。bashecho '[{"name":"Alice"},{"name":"Bob"}]' | jq '.[]' -
条件筛选 :结合
select函数可以根据条件过滤数组元素。bash# 筛选出age大于25的对象 echo '[{"name":"Alice","age":30},{"name":"Bob","age":20}]' | jq '.[] | select(.age > 25)' -
映射转换 :使用
map函数可以对数组中的每个元素应用相同的操作。bash# 提取所有对象的name字段,组成新数组 echo '[{"name":"Alice"},{"name":"Bob"}]' | jq 'map(.name)'
-
-
构造与修改JSON:jq不仅可以查询,还能创建和修改JSON数据。
-
构造新对象 :使用
{ }可以构造新的JSON对象。bashecho '{"firstName":"John","lastName":"Doe"}' | jq '{fullName: .firstName + " " + .lastName}' -
修改字段值 :使用
|=运算符可以更新字段的值。bash# 将version字段的值增加1 jq '.version |= .+1' data.json -
删除字段 :使用
del函数可以删除指定的字段。bashjq 'del(.tempData)' data.json
-
⚠️ 实用技巧与注意事项
-
处理外部变量 :在shell脚本中,可以使用
--arg选项将shell变量传递给jq过滤器。bashname="Alice" echo '{}' | jq --arg n "$name" '.name = $n' -
控制输出格式 :除了
-r,-c选项可以输出紧凑的单行JSON,适合日志记录。 -
处理大型文件 :处理非常大的JSON文件时,避免使用
-s(slurp)选项一次性将整个文件读入内存,可以考虑使用--stream选项进行流式解析。 -
错误处理 :使用
?操作符可以进行安全访问,当路径不存在时不会报错,而是返回null。结合//运算符可以提供默认值。bashjq '.maybeMissingKey? // "default value"' data.json