jq
是 Linux 中用于处理 JSON 数据的强大命令行工具。它可以对 JSON 数据进行解析、查询、过滤和格式化。jq
类似于 sed
、awk
和 grep
,但专门用于 JSON 数据的处理。
jq
的基本语法jq [选项] 'filter' [file...]
filter
: 用来提取、修改或格式化 JSON 数据的表达式。file
: 要处理的 JSON 文件。如果不指定文件,jq
默认从标准输入读取数据。.
:表示整个 JSON 对象。-r
:不加引号输出,适用于需要纯文本的场景。-s
:将多个输入合并为一个 JSON 数组。-c
:输出紧凑格式的 JSON,而不是默认的美化格式。假设有一个 JSON 文件 data.json
,内容如下:
{
"name": "Alice",
"age": 30,
"gender": "Female",
"skills": ["Python", "Linux", "Git"]
}
提取 name
字段:
jq '.name' data.json
输出:
"Alice"
提取 age
字段:
jq '.age' data.json
输出:
30
提取 skills
数组的第一个元素:
jq '.skills[0]' data.json
输出:
"Python"
提取所有 skills
元素:
jq '.skills[]' data.json
输出:
"Python"
"Linux"
"Git"
提取 name
和 age
字段:
jq '.name, .age' data.json
输出:
"Alice"
30
以对象形式提取 name
和 age
:
jq '{name: .name, age: .age}' data.json
输出:
{
"name": "Alice",
"age": 30
}
假设你有一个 JSON 数组文件 users.json
,内容如下:
[
{"name": "Alice", "age": 30},
{"name": "Bob", "age": 25},
{"name": "Charlie", "age": 35}
]
过滤出 age
大于 30 的用户:
jq '.[] | select(.age > 30)' users.json
输出:
{
"name": "Charlie",
"age": 35
}
将 age
字段加 1:
jq '.age += 1' data.json
输出:
{
"name": "Alice",
"age": 31,
"gender": "Female",
"skills": ["Python", "Linux", "Git"]
}
jq
默认会美化 JSON 输出。假设你从某个 API 获取了压缩格式的 JSON 数据:
{"name":"Alice","age":30,"gender":"Female","skills":["Python","Linux","Git"]}
格式化输出:
jq '.' data.json
输出:
{
"name": "Alice",
"age": 30,
"gender": "Female",
"skills": [
"Python",
"Linux",
"Git"
]
}
-r
输出纯文本提取 name
字段,并以纯文本输出:
jq -r '.name' data.json
输出:
Alice
假设有以下嵌套的 JSON 数据:
{
"person": {
"name": "Alice",
"age": 30,
"address": {
"city": "New York",
"zip": "10001"
}
}
}
提取嵌套的 city
字段:
jq '.person.address.city' data.json
输出:
"New York"