整体说明
- jq 是 Linux 下轻量、强大的命令行 JSON 处理器
- 包含功能:
- JSON 数据的解析、过滤、转换、格式化与流式处理
- 是平时工作时,日志查看抽取,Json 字段修改,构造新的 Json 等常用的工具
jq 基本语法
从文件读取:
1
jq [参数] 'filter_statement' [json_file_name]
参数用于指定输出形式等'filter_statement'表示过滤器表达式,可以用于访问 Json 对象内部的字段json_file_name表示 Json 文件名
或从标准输入读取
1
2cat data.json | jq 'filter_statement'
echo '{"key":"value"}' | jq 'filter_statement'
jq 常用参数:
-c/--compact-output:- 单行显示 JSON(紧凑输出,不做美化),常用于压缩过长的输出(注:输出是有颜色的,所以相比普通的纯文本会更易读取)
-r/--raw-output:- 输出原始字符串,自动去除 JSON 引号,主要适合脚本直接使用文本内容
-C:- 启用彩色高亮输出(当前默认终端都启用这个参数的)
jq 常用过滤器
基础访问语法
.:输出整个输入 JSON,用于格式化美化- 示例:
echo '{"name":"Alice"}' | jq '.' - 注:
- 省略过滤器时默认跟
.效果一致 - 使用是记得加双引号
- 省略过滤器时默认跟
- 示例:
.字段名:提取对象字段值- 嵌套时可用
.父字段.子字段链式访问 - 示例:
echo '{"user":{"name":"Bob"}}' | jq '.user.name'
- 嵌套时可用
.字段名?:- 安全访问字段,字段不存在时返回
null,不报错
- 安全访问字段,字段不存在时返回
.[索引]:- 访问数组元素,索引从 0 开始
.[起始:]取切片.[起始:结束]取区间- 示例:
echo '["a","b","c"]' | jq '.[1]'(取第二个元素)
.[]:- 迭代数组/对象所有元素,展开为独立输出
- 示例:
echo '["x","y"]' | jq '.[]'(每行输出一个元素)
.[]?:- 安全迭代,空数组/对象时不报错
jq 管道与组合
|:- 管道符,可将前一个过滤器的输出作为后一个的输入
- 示例:
echo '{"users":[{"name":"A"},{"name":"B"}]}' | jq '.users[] | .name'- 输出为两行
1
2"A"
"B"
- 输出为两行
,:- 多表达式组合,依次执行并输出多个结果
- 示例:
echo '{"a":1,"b":2}' | jq '.a, .b'- 输出为两行
1
21
2
- 输出为两行
A // B:- 空值合并,
A为null或 空时,取B - 示例:
echo '{"name":null}' | jq '.name // "Unknown"'
- 空值合并,
jq 常用内置函数
keys:获取对象的键名列表,或数组的索引列表- 示例:
echo '{"x":1,"y":2}' | jq 'keys'- 输出:
1
2
3
4[
"x",
"y"
]
- 输出:
- 示例:
length:返回数组长度、字符串长度或对象键的数量- 示例:
echo '{"name":null}' | jq 'length'- 输出
1
1
- 输出
- 示例:
map(过滤器):对数组每个元素应用过滤器,返回新数组- 示例:
echo '[1,2,3]' | jq 'map(. * 2)'(每个元素的值翻倍)- 输出:
1
2
3
4
5[
2,
4,
6
]
- 输出:
- 示例:
select(条件):按条件过滤元素,保留满足条件的结果- 示例:
echo '[{"age":20},{"age":30}]' | jq '.[] | select(.age > 25)'- 输出:
1
2
3{
"age": 30
}
- 输出:
- 示例:
sort_by(字段):按指定字段对数组排序- 示例:
echo '[{"age":30},{"age":20}]' | jq 'sort_by(.age)'- 输出:
1
2
3
4
5
6
7
8[
{
"age": 20
},
{
"age": 30
}
]
- 输出:
- 示例:
jq 的一些常用用法示例
构造新 JSON
1
2
3# 提取指定字段并重组
echo '{"name":"Alice","age":30,"city":"Beijing"}' | jq '{userName:.name, userAge:.age}'
# 输出:{"userName":"Alice","userAge":30}条件判断与修改
1
2# 年龄大于25则标记为成年
echo '[{"name":"A","age":20},{"name":"B","age":30}]' | jq '.[] | . + {adult:(.age > 25)}'