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한 다음 이러한 부분합을 함께 추가합니다. 귀하의 예에는 내부 배열이 하나만 있습니다.

결과를 쉘 변수에 넣는 것은 명령 대체에서 파이프를 실행하고 이를 변수에 할당하는 문제입니다.

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

--data "$(echo $PAYLOAD)"--data "$PAYLOAD"또한 쉘이 , 및 의 인용되지 않은 값에 대해 분할 및 파일 이름 글로빙을 수행하고 , $PAYLOADecho의 특수 처리를 수행해야 하는 경우가 아니면 로 작성하는 것이 가장 좋습니다 .\n\t\\

관련 정보