JSON 数据的命令行工具jq

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. 组合多个字段

组合输出 nameage

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

输出:

{
  "name": "John",
  "age": 31
}

8. 从多个文件中读取数据

将多个 JSON 对象读入为数组。
假设我们有两个 JSON 文件 data1.jsondata2.json,使用 jq 读取并组合它们:

jq --slurp '.' data1.json data2.json

缩写

jq -s '.' data1.json data2.json

输出(假设 data1.jsondata2.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. 过滤字段

只保留 nameage 字段:

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 数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值