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