jq命令

jq 是 Linux 中用于处理 JSON 数据的强大命令行工具。它可以对 JSON 数据进行解析、查询、过滤和格式化。jq 类似于 sedawkgrep,但专门用于 JSON 数据的处理。

jq 的基本语法

jq [选项] 'filter' [file...]
  • filter: 用来提取、修改或格式化 JSON 数据的表达式。
  • file: 要处理的 JSON 文件。如果不指定文件,jq 默认从标准输入读取数据。

常用选项

  • .:表示整个 JSON 对象。
  • -r:不加引号输出,适用于需要纯文本的场景。
  • -s:将多个输入合并为一个 JSON 数组。
  • -c:输出紧凑格式的 JSON,而不是默认的美化格式。

常见示例

1. 提取 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

2. 提取数组中的元素

提取 skills 数组的第一个元素

jq '.skills[0]' data.json

输出:

"Python"

提取所有 skills 元素

jq '.skills[]' data.json

输出:

"Python"
"Linux"
"Git"

3. 提取多个字段

提取 nameage 字段

jq '.name, .age' data.json

输出:

"Alice"
30

以对象形式提取 nameage

jq '{name: .name, age: .age}' data.json

输出:

{
  "name": "Alice",
  "age": 30
}

4. 过滤数组或对象

假设你有一个 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
}

5. 修改 JSON 数据

age 字段加 1

jq '.age += 1' data.json

输出:

{
  "name": "Alice",
  "age": 31,
  "gender": "Female",
  "skills": ["Python", "Linux", "Git"]
}

6. 格式化 JSON 数据

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"
  ]
}

7. 使用 -r 输出纯文本

提取 name 字段,并以纯文本输出

jq -r '.name' data.json

输出:

Alice

8. 处理嵌套 JSON 数据

假设有以下嵌套的 JSON 数据:

{
  "person": {
    "name": "Alice",
    "age": 30,
    "address": {
      "city": "New York",
      "zip": "10001"
    }
  }
}

提取嵌套的 city 字段

jq '.person.address.city' data.json

输出:

"New York"