JQを使用してナイフ検索でCSVを生成する

JQを使用してナイフ検索でCSVを生成する

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(",")'

これ:

  1. 配列拡張.rows出力ストリームへの入力(.rows.[])。
  2. 流れるパイプ次のステップ(|)に進みます。
  3. 指定されたオブジェクトを(この場合)含まれる単一の値(.[])に展開します。
  4. 配列を作成.name.["cpu.total"]、 の結果.["memory.total"] それぞれがオブジェクトを評価します。.[ .name, ... ])。
  5. すべての値を変換配列の文字列としてmap(tostring))。
  6. 要素接続各配列の前にはカンマ(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文字列全体を手動で作成します。高度にカスタマイズされた形式が必要な場合は、最も柔軟なオプションです。

おすすめ記事