我有一个这样的查询:
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
\\