Durchlaufen Sie JSON mit jq, um mehrere Werte zu erhalten und sie in einer einzigen Zeile zusammenzuführen

Durchlaufen Sie JSON mit jq, um mehrere Werte zu erhalten und sie in einer einzigen Zeile zusammenzuführen

Ich verwende jq, um einige Daten im gewünschten Format zu erhalten. Die vollständigen JSON-Daten eines Pods werden hier eingefügt.https://pastebin.com/UMJA7xd5. Diese Daten sind eines der Pods im JSON-Format. Ich werde es auf allen Pods ausführen, damit ich die Informationen wie folgt auflisten kann:

Podname, 1. Containername, CPU-Limit, Speicherlimit, 2. Containername, CPU-Limit, Speicherlimit usw. basierend auf der Anzahl der Container

Basierend auf der Anzahl der Container in einem Pod. Die Anzahl der Container in Pods ist zufällig, einige Pods haben 1 oder einige haben bis zu 5 Container.

Ich kann bis hierher erstellen.

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

was mir eine Ausgabe wie unten gibt: -

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

In den obigen Beispieldaten werden Daten von zwei Containern für ein einzelnes Pod Kafka-0 gedruckt. Das Kafka-Pod hat zwei Container, daher werden zwei Zeilen erzeugt.

Erwartetes Ergebnis:

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

Ich bin neu bei jq und habe viele Optionen ausprobiert, bin aber nicht weitergekommen. Vielleicht mache ich etwas falsch. In diesem Container variieren die Werte, daher konnten diese Zeilen nicht verbunden werden.

Antwort1

$ 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

verwandte Informationen