![将 jq 输出合并为逗号分隔的字符串](https://linux22.com/image/95274/%E5%B0%86%20jq%20%E8%BE%93%E5%87%BA%E5%90%88%E5%B9%B6%E4%B8%BA%E9%80%97%E5%8F%B7%E5%88%86%E9%9A%94%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
我正在尝试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}'