Csv

使用 JQ 從刀搜尋生成 CSV

  • July 11, 2021

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

這:

  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它來代替最後兩個步驟。

... | 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欄位,而是手動建構整個字元串。如果您需要高度自定義的格式,這是最靈活的選項。

引用自:https://unix.stackexchange.com/questions/381052