Csv
使用 JQ 從刀搜尋生成 CSV
JQ 看起來像一個很棒的工具,但我正在努力使用它。這就是我想要做的:只從這個廚師刀搜尋中提取值並生成一個 CSV。
給定這個命令和輸出:
刀搜尋節點 “name:foo*” -a name -a cpu.total -a memory.total -Fj
{ “結果”:2, “行”:[ { “foo-01”:{ “名稱”:“foo-01”, “cpu.total”:12, “memory.total”:“16267368kB” } }, { “富-02”:{ “名稱”:“foo-02”, “cpu.total”:12, “memory.total”:“16264296kB” } } ] }
我想像這樣將值提取到 CSV:
foo-01,12,16267368kB foo-02,12,16264296kB
(我可以處理報價)
... | 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
它來代替最後兩個步驟。... | jq -r '.rows[] | .[] | [.name, .["cpu.total"], .["memory.total"]] | @csv'
我們可以通過只轉換裡面的一個值來跳過
map
,這需要一些額外的括號:... | jq -r '.rows[]|.[]|[.name, (.["cpu.total"] | tostring), .["memory.total"]] | join(",")'
可能是最醜陋的選擇:
... | jq -r '.rows[]|to_entries|.[]|.key + "," + (.value["cpu.total"] | tostring) + "," + .value["memory.total"]'
在這種情況下,我們不依賴該
.name
欄位,而是手動建構整個字元串。如果您需要高度自定義的格式,這是最靈活的選項。