jqフィルタを使用してJSON出力をbashの変数に解析します。

jqフィルタを使用してJSON出力をbashの変数に解析します。

次のクエリがあります。

curl -s \
-X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $API_TOKEN" \
--data "$(echo $PAYLOAD)" \
https://myapi/client/v4/graphql/ | jq .

...次のような出力が生成されます。

{
  "data": {
    "viewer": {
      "accounts": [
        {
          "magicTransitTunnelTrafficAdaptiveGroups": [
            {
              "avg": {
                "bitRateFiveMinutes": 23360
              },
              "dimensions": {
                "datetimeFiveMinutes": "2022-12-30T09:00:00Z",
                "tunnelName": "nw-blue"
              }
            },
            {
              "avg": {
                "bitRateFiveMinutes": 8960
              },
              "dimensions": {
                "datetimeFiveMinutes": "2022-12-30T09:00:00Z",
                "tunnelName": "mtlab_gcp1"
              }
            },
            {
              "avg": {
                "bitRateFiveMinutes": 95493
              },
              "dimensions": {
                "datetimeFiveMinutes": "2022-12-30T09:00:00Z",
                "tunnelName": "Cherry_CBE_1"
              }
            },
            {
              "avg": {
                "bitRateFiveMinutes": 2968507
              },
              "dimensions": {
                "datetimeFiveMinutes": "2022-12-30T09:00:00Z",
                "tunnelName": "Cherry_VCB"
              }
            },
            {
              "avg": {
                "bitRateFiveMinutes": 10880
              },
              "dimensions": {
                "datetimeFiveMinutes": "2022-12-30T09:00:00Z",
                "tunnelName": "accelia-poc1"
              }
            },
            {
              "avg": {
                "bitRateFiveMinutes": 21227
              },
              "dimensions": {
                "datetimeFiveMinutes": "2022-12-30T09:00:00Z",
                "tunnelName": "mtlab_sr_pni"
              }
            },
            {
              "avg": {
                "bitRateFiveMinutes": 27627
              },
              "dimensions": {
                "datetimeFiveMinutes": "2022-12-30T09:00:00Z",
                "tunnelName": "mtlab-tme-gcp1"
              }
            }
          ]
        }
      ]
    }
  },
  "errors": null
}

bitRateFiveMinutesすべての値を解析して追加し、評価のために変数に入力したいと思います。このオプションを使用してこれを行うにはどうすればよいですかjq -r?上記の例を見るとhttps://stedolan.github.io/jq/manual/しかし、何を使うべきかわかりません。+私のために追加のタスクを実行する組み込み演算子があるようです。

答え1

ここでは、必要な値へのフルパスを作成する必要がないように、いくつかの近道を選びました。値を配列に入れて実行してadd要約します。

curl -s ... |
jq '[ .data[][][][][].avg.bitRateFiveMinutes ] | add'

あなたの質問の例が与えられた場合、整数は文字列としてエンコードされないので、3156054ここで使用jqするオプションは必要ありません。-r

より詳細なjqコマンドは次のとおりです。

curl -s ... |
jq '.data.viewer.accounts |
    map(.magicTransitTunnelTrafficAdaptiveGroups |
        map(.avg.bitRateFiveMinutes) | add) | add'

まず、各配列のすべての項目の合計を計算magicTransitTunnelTrafficAdaptiveGroupsし、これらの小計を一緒に追加します。あなたの例には1つの内部配列しかありません。

結果をシェル変数に入れることは、コマンド置換でパイプを実行し、それを変数に割り当てる問題です。

avgsum=$(
    curl -s ... |
    jq '[ .data[][][][][].avg.bitRateFiveMinutes ] | add'
)

--data "$(echo $PAYLOAD)"--data "$PAYLOAD"$PAYLOADまた、シェルが、および引用符で囲まれていない値に対して分割およびファイル名のグロービングを実行し、およびecho特別な処理を実行する必要がない限りで作成するのが最善です。\n\t\\

関連情報