基本用法
1
2
3
4
| jq [options] [filter] [file]
options:可选参数,用于指定 jq 的选项
filter:必选参数,用于指定 json 数据的查询和转换操作
file:可选参数,要处理的 json 数据文件
|
常用选项
1
2
3
4
5
6
7
8
9
| --version:输出 jq 的版本信息
-s:读入整个输入流到一个数组
-R:不作为 json 解析,将每一行的文本作为字符串输出到屏幕
-n:不读取任何输入,过滤器运行使用 null 作为输入,一般用作从头构建 json 数据
-c:使输出紧凑,而不是把每一个 json 对象输出在一行
-C:打开颜色显示
-M:关闭颜色显示
-a:指定输出格式为 ASCII
-r:如果过滤的结果是一个字符串,那么直接写到标准输出(去掉字符串的引号)
|
查询和过滤
.:表示当前对象,用于访问字段或属性
.fieldName:选择指定字段的值
[]:用于遍历数组元素
select(condition): 根据条件选择元素
map(transform): 对数组中的每个元素应用转换操作
例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| [
{
"name": "Alice",
"age": 25,
"city": "New York"
},
{
"name": "Bob",
"age": 30,
"city": "Los Angeles"
},
{
"name": "Charlie",
"age": 22,
"city": "Chicago"
}
]
|
选择字段
1
2
3
4
5
6
| # 查询并选择所有人的姓名
cat data.json | jq '.[].name'
"Alice"
"Bob"
"Charlie"
|
过滤
1
2
3
4
5
| # 选择年龄大于 25 岁的人的姓名和城市
cat data.json | jq '.[] | select(.age > 25) | .name, .city'
"Bob"
"Los Angeles"
|
遍历数组
1
2
3
4
5
6
| # 遍历并输出所有人的年龄
cat data.json | jq '.[] | .age'
25
30
22
|
组合操作
1
2
3
4
5
6
7
| # 选择年龄在 25 到 30 岁之间的人的姓名和城市,并按照姓名排序
cat data.json | jq '.[] | select(.age >= 25 and .age <= 30) | .name, .city'
"Alice"
"New York"
"Bob"
"Los Angeles"
|
修改和创建
- .fieldName = value: 修改字段的值。
- del(.fieldName): 删除指定字段。
- .newField = value: 创建新的字段
例
1
2
3
4
5
| {
"name": "Alice",
"age": 25,
"city": "New York"
}
|
修改字段的值
1
2
3
4
5
6
7
8
| # 修改年龄字段的值为 26
cat data.json | jq '.age = 26'
{
"name": "Alice",
"age": 26,
"city": "New York"
}
|
创建新字段
1
2
3
4
5
6
7
8
9
| # 添加一个新的字段 country 并设置其值为 "USA"
cat data.json | jq '.country = "USA"'
{
"name": "Alice",
"age": 25,
"city": "New York",
"country": "USA"
}
|
组合操作
1
2
3
4
5
6
7
8
9
| # 修改年龄字段的值为 26,并添加一个新的字段 country
cat data.json | jq '.age = 26 | .country = "USA"'
{
"name": "Alice",
"age": 26,
"city": "New York",
"country": "USA"
}
|
条件修改
1
2
3
4
5
6
7
8
| # 如果年龄小于 30,则将城市修改为 "Chicago"
cat data.json | jq 'if .age < 30 then .city = "Chicago" else . end'
{
"name": "Alice",
"age": 25,
"city": "Chicago"
}
|
运算符
- +, -, *, /: 数值运算。
- ==, !=, <, >, <=, >=: 比较运算。
- and, or, not: 逻辑运算。
例
1
2
3
4
5
| {
"a": 10,
"b": 5,
"c": 15
}
|
数值运算
1
2
3
4
5
6
7
8
9
10
| # 进行加法、减法、乘法和除法运算
cat data.json | jq '.a + .b'
cat data.json | jq '.a - .b'
cat data.json | jq '.a * .b'
cat data.json | jq '.a / .b'
15
5
50
2
|
比较运算
1
2
3
4
5
6
7
8
| # 比较字段值,返回布尔结果
cat data.json | jq '.a > .b'
cat data.json | jq '.a >= .c'
cat data.json | jq '.b < .c'
true
false
true
|
逻辑运算
1
2
3
4
5
6
7
8
| # 执行逻辑 AND、OR 和 NOT 操作
cat data.json | jq '.a > 5 and .b < 10'
cat data.json | jq '.a > 15 or .b > 10'
cat data.json | jq 'not (.c > 20)'
true
true
false
|
条件运算
1
2
3
4
| # 使用 if 和 then 进行条件运算
cat data.json | jq 'if .a > 10 then "Greater" else "Less or equal" end'
"Less or equal"
|
变量和条件
- as $variable: 将结果保存到变量中。
- if condition then … else … end: 条件语句
例
1
2
3
4
5
| {
"name": "Alice",
"age": 25,
"city": "New York"
}
|
使用变量
1
2
3
4
| # 将字段值存储到变量中,并在输出中使用变量
cat data.json | jq '.age as $age | "Name: \(.name), Age: \($age)"'
"Name: Alice, Age: 25"
|
条件语句
1
2
3
4
| # 使用 if 和 then 进行条件判断
cat data.json | jq 'if .age > 18 then "Adult" else "Minor" end'
"Adult"
|
条件判断和变量组合
1
2
3
4
| # 结合条件语句和变量,根据年龄输出不同的消息
cat data.json | jq 'if .age > 18 then "Name: \(.name), Status: Adult" else "Name: \(.name), Status: Minor" end'
"Name: Alice, Status: Adult"
|
使用条件操作修改数据
1
2
3
4
5
6
7
8
| # 根据年龄字段的值,如果大于 30 则修改城市字段
cat data.json | jq 'if .age > 30 then .city = "Chicago" else . end'
{
"name": "Alice",
"age": 25,
"city": "New York"
}
|
函数
jq 支持一些内置函数,如 length, keys, values, tostring 等,用于操作和处理 JSON 数据
例
1
2
3
4
5
6
| {
"name": "Alice",
"age": 25,
"city": "New York",
"scores": [85, 90, 78, 95]
}
|
length 函数
1
2
3
4
| # 获取数组的长度
cat data.json | jq '.scores | length'
4
|
map 函数
1
2
3
4
| # 对数组中的每个元素应用转换操作
cat data.json | jq '.scores | map(. * 2)'
[170,180,156,190]
|
keys 和 values 函数
1
2
3
4
5
6
| # 获取对象的键和值
cat data.json | jq '. | keys'
cat data.json | jq '. | values'
["name","age","city","scores"]
["Alice",25,"New York",[85,90,78,95]]
|
to_entries 函数
1
2
3
4
5
6
7
8
9
| # 将对象转换为键值对数组
cat data.json | jq '. | to_entries'
[
{"key":"name","value":"Alice"},
{"key":"age","value":25},
{"key":"city","value":"New York"},
{"key":"scores","value":[85,90,78,95]}
]
|
自定义函数
1
2
3
4
| # 使用自定义函数进行操作
cat data.json | jq 'def average: reduce .[] as $item (0; . + $item) / length; .scores | average'
87
|