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

以下は、通話中の人のEメールアドレスの1つを取得します。最初通貨レベルのエスカレーションポリシーは2です。

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

この情報を具体的にリクエストすることはありませんでしたが、次の内容から、次の名前の担当者のメールアドレスを知ることができます。最低 .levelon_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

関連情報