將 jq 輸出合併為逗號分隔的字串

將 jq 輸出合併為逗號分隔的字串

我正在嘗試curl一些返回 json 檔案的 URL,然後我想從中解析主機並創建一個逗號分隔的字串。

我的第一部分正在工作

curl -s -u "admin:admin" -H "X-Requested-By: ambari" "https://hbasecluster.net/api/v1/clusters/mycluster/services/ZOOKEEPER/components/ZOOKEEPER_SERVER" | jq -r '.host_components[].HostRoles.host_name'

返回

zk0-mycluster.net
zk1-mycluster.net
zk2-mycluster.net

現在我想將這些連接成一個字串,例如

zk0-mycluster.net,zk1-mycluster.net,zk2-mycluster.net

答案1

執行此操作jq,但請參閱@Kusalananda的回答 第一的

jq -r '.host_components[].HostRoles.host_name | join(",")'

不,那是錯誤的。這就是您所需要的:

jq -r '.host_components | map(.HostRoles.host_name) | join(",")'

演示:

jq -r '.host_components | map(.HostRoles.host_name) | join(",")' <<DATA
{"host_components":[
  {"HostRoles":{"host_name":"one"}},
  {"HostRoles":{"host_name":"two"}},
  {"HostRoles":{"host_name":"three"}}
]}
DATA

輸出

one,two,three

答案2

paste是完成這項工作的最佳工具:

your_command | paste -sd, -

答案3

如果您想要 JSON 文件的 CSV 格式輸出,那麼您可以使用@csv中的運算子jq

somecommand | jq -r '[ .host_components[].HostRoles.host_name ] | @csv'

這使用您在問題中使用的相同表達式來提取所需的數據,但它將所有主機名稱放入一個陣列中。然後傳遞該數組@csv,以確保為 CSV 輸出正確引用資料。

您期望從中得到以下輸出:

"zk0-mycluster.net","zk1-mycluster.net","zk2-mycluster.net"

值中嵌入的任何逗號、雙引號或換行符都將按照 CSV 格式檔案中的預期正確引用。

答案4

如果你想使用awk,只需列印 no newline

    <your command> | awk 'NR > 1 { printf(",") } {printf "%s",$0}'

相關內容