我正在嘗試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}'