jqを使用してjsonを繰り返して複数の値を取得し、それを1行に結合します。

jqを使用してjsonを繰り返して複数の値を取得し、それを1行に結合します。

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

podname、最初のコンテナ名、CPU制限、メモリ制限、2番目のコンテナ名、CPU制限、メモリ制限 - コンテナ数

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

上記のサンプルデータでは、2つのコンテナのデータが単一のPod kafka-0に対して印刷されます。 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

おすすめ記事