jq を使用して json をループし、複数の値を取得して 1 行にマージします。

jq を使用して json をループし、複数の値を取得して 1 行にマージします。

私はjqを使用して必要な形式でデータを取得しています。ポッドの完全なjsonデータがここに貼り付けられています。https://pastebin.com/UMJA7xd5このデータはJSON形式のポッドの1つです。これをすべてのポッドで実行して、次のような情報を一覧表示できるようにします。

podname、1 番目のコンテナ名、CPU 制限、メモリ制限、2 番目のコンテナ名、CPU 制限、メモリ制限 (コンテナの数に基づく)

ポッド内のコンテナの数に基づきます。ポッド内のコンテナの数はランダムで、ポッドによってはコンテナが 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

上記のデータ例では、単一のポッド kafka-0 の 2 つのコンテナのデータを出力しています。kafka ポッドには 2 つのコンテナがあるため、2 行が生成されます。

期待される結果:

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

関連情報