使用 jq 从 JSON 数组中使用特定键从条目中获取数据

使用 jq 从 JSON 数组中使用特定键从条目中获取数据

我们如何从下面 JSON 文档中的键具有值的email条目中获取 ?level2

预期输出是

[email protected]

请问有什么建议吗?

{
  "escalation_policy": {
    "on_call": [
      {
        "level": 2,
        "start": "2022-05-25T00:30:00Z",
        "end": "2022-05-25T09:30:00Z",
        "user": {
          "id": "ABOKC",
          "name": "Jaavena Dobey",
          "email": "[email protected]",
          "time_zone": "Tokyo"
        }
      },
      {
        "level": 7,
        "start": "2022-05-23T01:00:00Z",
        "end": "2022-05-30T01:00:00Z",
        "user": {
          "id": "KLSPSP",
          "name": "kosls frank",
          "email": "[email protected]",
          "time_zone": "Tokyo"
        }
      },
      {
        "level": 3,
        "start": "2022-05-23T01:00:00Z",
        "end": "2022-05-30T01:00:00Z",
        "user": {
          "id": "SKSPSLSL",
          "name": "Smitha Choudhary",
          "email": "[email protected]",
          "time_zone": "Tokyo"
        }
      }
    ]
  }
}

答案1

像这样,

  1. 获取对象数组。
  2. 选择级别为2的
  3. 在返回的数组中,打印用户的电子邮件

调用和输出,

$ jq ".escalation_policy.on_call[] | select( .level == 2) | .user.email" test.json
"[email protected]"

答案2

以下内容获取待命人员的电子邮件地址之一,即第一的呼叫级别升级策略等于 2:

jq -r '.escalation_policy.on_call | map(select(.level == 2))[0].user.email' file

您没有专门询问此信息,但以下内容为您提供了值班人员的电子邮件地址,其名称为最低 .level。我们通过对on_call数组进行排序并.user.email从最先排序的条目返回值来实现此目的:

jq -r '.escalation_policy.on_call | sort_by(.level)[0].user.email' file

我们还可以确保当前时间在.start.end时间戳内。为此,我们仅选择相关的待命条目,然后像以前一样对它们进行排序:

jq -r '
    .escalation_policy.on_call |
    map(select( now > (.start|fromdate) and now < (.end|fromdate) )) |
    sort_by(.level)[0].user.email' file

fromdate我们可以这样做,因为我们很幸运能够拥有与函数期望的格式完全相同的日期jq

相关内容