다음과 같은 쿼리가 있습니다.
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
한 다음 이러한 부분합을 함께 추가합니다. 귀하의 예에는 내부 배열이 하나만 있습니다.
결과를 쉘 변수에 넣는 것은 명령 대체에서 파이프를 실행하고 이를 변수에 할당하는 문제입니다.
avgsum=$(
curl -s ... |
jq '[ .data[][][][][].avg.bitRateFiveMinutes ] | add'
)
--data "$(echo $PAYLOAD)"
--data "$PAYLOAD"
또한 쉘이 , 및 의 인용되지 않은 값에 대해 분할 및 파일 이름 글로빙을 수행하고 , $PAYLOAD
및 echo
의 특수 처리를 수행해야 하는 경우가 아니면 로 작성하는 것이 가장 좋습니다 .\n
\t
\\