将 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}'

相关内容