JQは素晴らしいツールのように見えますが、使用するのに苦労しています。私がしたいことは、シェフのナイフ検索から値のみを抽出してCSVを生成することです。
次のコマンドと出力が与えられた場合:
Knifeは「name:foo *」ノードを検索します。 -a name -a cpu.total -a memory.total -Fj
{ 「結果」:2、 「いいね」:[ { "foo-01":{ "名前": "foo-01", "CPU.総計": 12, 「メモリ。全体」:「16267368kB」 } }, { "foo-02": { 「名前」:「foo-02」、 "CPU.総計": 12, 「メモリ。全体」:「16264296kB」 } } ] }
次のように値をCSVに抽出したいと思います。
foo-01,12,16267368kB foo-02,12,16264296kB
(引用文を処理できます)
答え1
... | jq -r '.rows[] | .[] | [.name, .["cpu.total"], .["memory.total"]] | map(tostring) | join(",")'
これ:
- 配列拡張
.rows
出力ストリームへの入力(.rows.[]
)。 - 流れるパイプ次のステップ(
|
)に進みます。 - 指定されたオブジェクトを(この場合)含まれる単一の値(
.[]
)に展開します。 - 配列を作成
.name
、.["cpu.total"]
、 の結果.["memory.total"]
それぞれがオブジェクトを評価します。(.[ .name, ... ]
)。 - すべての値を変換配列の文字列として(
map(tostring)
)。 - 要素接続各配列の前にはカンマ(
join(",")
)が付きます。
jq -r
生データ出力、引用し、エスケープする代わりに。その後、出力は次のようになります。
foo-01,12,16267368kB
foo-02,12,16264296kB
あなたが望むように。 CSVパーサーと実際のデータによっては、文字列の周りに引用符を追加する必要があります。これらの引用符を追加できます。または使用@csv
最後の2つのステップを交換してください。
... | jq -r '.rows[] | .[] | [.name, .["cpu.total"], .["memory.total"]] | @csv'
map
内部に1つの値だけを変換すると、この操作はスキップできます。ここには追加の括弧が必要です。
... | jq -r '.rows[]|.[]|[.name, (.["cpu.total"] | tostring), .["memory.total"]] | join(",")'
おそらく最も醜いオプションは次のとおりです。
... | jq -r '.rows[]|to_entries|.[]|.key + "," + (.value["cpu.total"] | tostring) + "," + .value["memory.total"]'
この場合、そのフィールドに依存せずに.name
文字列全体を手動で作成します。高度にカスタマイズされた形式が必要な場合は、最も柔軟なオプションです。
答え2
「SEに質問を投稿すると回答が表示されます」という「宇宙の法則」がある可能性があります。私に役立つ方法は次のとおりです。
Knifeはノード「name:foo *」を検索します。 -a name -a cpu.total -a memory.total -Fj | jq -r '.rows [] | jq -r '.rows[] |map(.[]) @csv' |
返品:
「foo-01」、12、「16267000kB」 「foo-02」、12、「16267000kB」
これはGoogleスプレッドシートにきれいにインポートされます。おそらく、Michaelが提供したいくつかの例を使用して、これをさらに調整できます。フィールド名を明示的に指定する必要がないので、これは気に入っています。 JQをもっと使うことを楽しみにしています。本当に素晴らしいツールです!