使用 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,然后将这些部分和加在一起。在您的示例中,只有一个内部数组。

将结果放入 shell 变量中就是在命令替换中运行管道并将其分配给变量的问题:

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

--data "$(echo $PAYLOAD)"另请注意,最好将您写为--data "$PAYLOAD",除非您需要让 shell 对 、 和 的未加引号的值执行拆分和文件名通配$PAYLOAD,并对、和echo进行特殊处理。\n\t\\

相关内容