将 jq 输出合并为逗号分隔的字符串

roy*_*roy 36 command-line curl json 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'
Run Code Online (Sandbox Code Playgroud)

返回

zk0-mycluster.net
zk1-mycluster.net
zk2-mycluster.net
Run Code Online (Sandbox Code Playgroud)

现在我想将这些加入一个字符串中

zk0-mycluster.net,zk1-mycluster.net,zk2-mycluster.net
Run Code Online (Sandbox Code Playgroud)

gle*_*man 87

在做 jq

jq -r '.host_components[].HostRoles.host_name | join(",")'
Run Code Online (Sandbox Code Playgroud)

不,那是错的。这是你需要的:

jq -r '.host_components | map(.HostRoles.host_name) | join(",")'
Run Code Online (Sandbox Code Playgroud)

演示:

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
Run Code Online (Sandbox Code Playgroud)

产出

one,two,three
Run Code Online (Sandbox Code Playgroud)

  • 作为替代方案,也应该可以:`jq -r '[.host_components[].HostRoles.host_name] | 加入(“,”)'` (4认同)

cuo*_*glm 17

paste 是完成这项工作的最佳工具:

your_command | paste -sd, -
Run Code Online (Sandbox Code Playgroud)


Kus*_*nda 17

如果您想要的是 JSON 文档的 CSV 格式输出,那么您可以使用@csv中的运算符jq

somecommand | jq -r '[ .host_components[].HostRoles.host_name ] | @csv'
Run Code Online (Sandbox Code Playgroud)

这使用与问题中使用的相同的表达式来提取所需的数据,但它将所有主机名放入一个数组中。然后传递该数组@csv,以确保为 CSV 输出正确引用数据。

您期望从中得到以下输出:

"zk0-mycluster.net","zk1-mycluster.net","zk2-mycluster.net"
Run Code Online (Sandbox Code Playgroud)

值中嵌入的任何逗号、双引号或换行符都将按照 CSV 格式文件中的预期正确引用。