jq
是一个用于处理 JSON 数据的命令行工具。它允许你对 JSON 数据进行过滤、转换、查询等操作,通常用于从 JSON 输出中提取特定信息。这个工具非常适合处理命令行中的 JSON 数据。
安装 jq
- 在 Linux: 可以通过包管理器安装,比如:
sudo apt-get install jq # Ubuntu/Debian sudo yum install jq # CentOS/RHEL
- 在 macOS: 使用 Homebrew 安装:
brew install jq
- 在 Windows: 可以从 jq 的 GitHub 发行页面 下载适合你的版本,或者使用包管理工具如 choco:
choco install jq
好的,下面我将为每个 jq
的常用用法举一个完整的例子,并结合一个示例 JSON 数据来说明。
常见用法
假设我们有以下 JSON 文件 data.json
:
{
"name": "John",
"age": 31,
"user": {
"id": 123,
"name": "John Doe"
},
"friends": [
{"name": "Jane", "age": 28},
{"name": "Mike", "age": 35}
],
"password": "secret123"
}
1. 基本查询
提取 name
字段的值:
jq '.name' data.json
输出:
"John"
2. 访问嵌套字段
提取嵌套字段 user.name
:
jq '.user.name' data.json
输出:
"John Doe"
3. 筛选数组中的元素
筛选出年龄大于 30 的朋友:
jq '.friends[] | select(.age > 30)' data.json
输出:
{
"name": "Mike",
"age": 35
}
4. 遍历数组
提取所有朋友的 name
字段:
jq '.friends[] | .name' data.json
输出:
"Jane"
"Mike"
5. 格式化输出
美化整个 JSON 文件的输出:
jq '.' data.json
输出:
{
"name": "John",
"age": 31,
"user": {
"id": 123,
"name": "John Doe"
},
"friends": [
{
"name": "Jane",
"age": 28
},
{
"name": "Mike",
"age": 35
}
],
"password": "secret123"
}
6. 修改 JSON 数据
将 user.name
修改为 "NewName"
:
jq '.user.name = "NewName"' data.json
输出:
{
"name": "John",
"age": 31,
"user": {
"id": 123,
"name": "NewName"
},
"friends": [
{
"name": "Jane",
"age": 28
},
{
"name": "Mike",
"age": 35
}
],
"password": "secret123"
}
7. 组合多个字段
组合输出 name
和 age
:
jq '{name: .name, age: .age}' data.json
输出:
{
"name": "John",
"age": 31
}
8. 从多个文件中读取数据
将多个 JSON 对象读入为数组。
假设我们有两个 JSON 文件 data1.json
和 data2.json
,使用 jq
读取并组合它们:
jq --slurp '.' data1.json data2.json
缩写
jq -s '.' data1.json data2.json
输出(假设 data1.json
和 data2.json
内容相似):
[
{
"name": "John",
"age": 31,
"user": {
"id": 123,
"name": "John Doe"
},
"friends": [
{
"name": "Jane",
"age": 28
},
{
"name": "Mike",
"age": 35
}
],
"password": "secret123"
},
{
"name": "Alice",
"age": 29,
"user": {
"id": 456,
"name": "Alice Smith"
},
"friends": [
{
"name": "Bob",
"age": 32
}
],
"password": "hidden789"
}
]
9. 使用变量
将变量 name="Alice"
传递给 jq
:
name="Alice"
jq --arg name "$name" '.user.name = $name' data.json
输出:
{
"name": "John",
"age": 31,
"user": {
"id": 123,
"name": "Alice"
},
"friends": [
{
"name": "Jane",
"age": 28
},
{
"name": "Mike",
"age": 35
}
],
"password": "secret123"
}
10. 过滤字段
只保留 name
和 age
字段:
jq 'with_entries(select(.key == "name" or .key == "age"))' data.json
输出:
{
"name": "John",
"age": 31
}
11. 删除字段
删除 password
字段:
jq 'del(.password)' data.json
输出:
{
"name": "John",
"age": 31,
"user": {
"id": 123,
"name": "John Doe"
},
"friends": [
{
"name": "Jane",
"age": 28
},
{
"name": "Mike",
"age": 35
}
]
}
12. 合并两个 JSON 对象
将一个新字段合并到现有 JSON 对象中:
jq '. + {"location": "New York"}' data.json
输出:
{
"name": "John",
"age": 31,
"user": {
"id": 123,
"name": "John Doe"
},
"friends": [
{
"name": "Jane",
"age": 28
},
{
"name": "Mike",
"age": 35
}
],
"password": "secret123",
"location": "New York"
}
13. 统计数组中的元素数量
统计 friends
数组的长度:
jq '.friends | length' data.json
输出:
2
14. 读取标准输入
从标准输入读取数据并查询 name
字段:
cat data.json | jq '.name'
输出:
"John"
通过这些例子,你可以更好地掌握 jq
的常用功能,帮助你高效地处理 JSON 数据。