jq를 사용하여 json을 반복하여 여러 값을 얻고 이를 한 줄에 결합합니다.

jq를 사용하여 json을 반복하여 여러 값을 얻고 이를 한 줄에 결합합니다.

필요한 형식으로 일부 데이터를 가져오기 위해 jq를 사용하고 있습니다. 포드의 전체 json 데이터가 여기에 붙여져 있습니다.https://pastebin.com/UMJA7xd5. 데이터는 json 형식의 Pod 중 하나입니다. 다음과 같은 정보를 나열할 수 있도록 모든 Pod에서 이를 실행하겠습니다.

podname, 첫 번째 컨테이너 이름, CPU 제한, 메모리 제한, 두 번째 컨테이너 이름, CPU 제한, 메모리 제한 - 컨테이너 수 기준

Pod의 컨테이너 수를 기준으로 합니다. Pod의 컨테이너 수는 무작위이며 일부 Pod에는 1개가 있고 일부 Pod에는 최대 5개의 컨테이너가 있습니다.

이것을 만들 수 있었습니다.

oc get po -o json | jq -j   '.items[] | "\(.metadata.name), \(.spec.containers[] | .name +" , "+ .resources.limits.cpu +" , "+ .resources.limits.memory)\n" '

이것은 나에게 다음과 같은 결과를 제공합니다:-

kafka-0, kafka , 16 , 16Gi
kafka-0, filebeat , 2 , 256Mi

위의 예제 데이터에서는 두 개의 컨테이너에 대한 데이터가 단일 Pod kafka-0에 대해 인쇄됩니다. kafka 포드에는 두 개의 컨테이너가 있으므로 두 개의 라인을 생성합니다.

예상되는 결과:

kafka-0, kafka , 16 , 16Gi, filebeat , 2 , 256Mi

저는 jq를 처음 접했고 많은 옵션을 시도했지만 성공하지 못했습니다. 아마도 제가 뭔가 잘못하고 있는 것 같습니다. 이 값은 컨테이너마다 다르므로 행을 조인할 수 없습니다.

답변1

$ cat test.jq
# Iterate over "items"

.items[] |

# Place each extracted element into an array

[
    # Select elements

    .metadata.name,

    # Use parentheses to group
    ( .spec.containers[] | .name, .resources.limits["cpu","memory"] )
]

# Join the array together

| join(", ")

$ <input jq -r -f test.jq
kafka-0, kafka, 16, 16Gi, filebeat, 2, 256Mi

관련 정보