Estoy intentando acceder a curl
alguna URL que devuelva un archivo json, luego quiero analizar los hosts y crear una cadena separada por comas.
ya tengo la primera parte funcionando
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'
que regresa
zk0-mycluster.net
zk1-mycluster.net
zk2-mycluster.net
Ahora quiero unirlos en una sola cadena como
zk0-mycluster.net,zk1-mycluster.net,zk2-mycluster.net
Respuesta1
Hazlo en jq
, pero miraLa respuesta de @Kusalananda primero
jq -r '.host_components[].HostRoles.host_name | join(",")'
No eso está mal. Esto es lo que necesitas:
jq -r '.host_components | map(.HostRoles.host_name) | join(",")'
Manifestación:
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
salidas
one,two,three
Respuesta2
paste
es la mejor herramienta para hacer este trabajo:
your_command | paste -sd, -
Respuesta3
Si lo que desea es una salida con formato CSV de su documento JSON, puede usar el @csv
operador en jq
.
somecommand | jq -r '[ .host_components[].HostRoles.host_name ] | @csv'
Esto usa la misma expresión que estás usando en la pregunta para extraer los datos que deseas, pero coloca todos los nombres de host en una matriz. Luego se pasa la matriz, @csv
lo que garantiza que los datos se citan correctamente para la salida CSV.
Esperaría obtener el siguiente resultado de esto:
"zk0-mycluster.net","zk1-mycluster.net","zk2-mycluster.net"
Cualquier coma, comilla doble o nueva línea incrustada en los valores se citará correctamente como se espera en un archivo con formato CSV.
Respuesta4
Si desea utilizar awk
, simplemente imprima sin newline
:
<your command> | awk 'NR > 1 { printf(",") } {printf "%s",$0}'