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

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

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

포드 이름, 첫 번째-컨테이너 이름, CPU 제한, 메모리 제한, 두 번째 컨테이너 이름, CPU 제한, 메모리 제한--so-on-based-on-number-ofcontainer

Pod의 컨테이너 수를 기준으로 합니다. Pod의 컨테이너 수는 무작위입니다. 일부 Pod에는 1개가 있고 일부에는 최대 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

관련 정보