Ich versuche es mit curl
einer URL, die eine JSON-Datei zurückgibt. Anschließend möchte ich Hosts daraus analysieren und eine durch Kommas getrennte Zeichenfolge erstellen.
Der erste Teil funktioniert
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'
was zurückgibt
zk0-mycluster.net
zk1-mycluster.net
zk2-mycluster.net
Jetzt möchte ich diese zu einem String zusammenfügen, wie
zk0-mycluster.net,zk1-mycluster.net,zk2-mycluster.net
Antwort1
Tun Sie es in jq
, aber sehen@Kusalanandas Antwort Erste
jq -r '.host_components[].HostRoles.host_name | join(",")'
Nein, das ist falsch. Das hier brauchen Sie:
jq -r '.host_components | map(.HostRoles.host_name) | join(",")'
Demo:
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
Ausgänge
one,two,three
Antwort2
paste
ist das beste Werkzeug für diese Aufgabe:
your_command | paste -sd, -
Antwort3
Wenn Sie eine CSV-formatierte Ausgabe aus Ihrem JSON-Dokument wünschen, können Sie den @csv
Operator in verwenden jq
.
somecommand | jq -r '[ .host_components[].HostRoles.host_name ] | @csv'
Dabei wird derselbe Ausdruck verwendet, den Sie in der Frage verwenden, um die gewünschten Daten abzurufen, aber es werden alle Hostnamen in ein Array eingefügt. Das Array wird dann durchgereicht, @csv
wodurch sichergestellt wird, dass die Daten für die CSV-Ausgabe richtig zitiert werden.
Sie würden erwarten, dass Sie die folgende Ausgabe erhalten:
"zk0-mycluster.net","zk1-mycluster.net","zk2-mycluster.net"
Alle in den Werten eingebetteten Kommas, Anführungszeichen oder Zeilenumbrüche würden wie erwartet in einer CSV-formatierten Datei in Anführungszeichen gesetzt.
Antwort4
Wenn Sie verwenden möchten awk
, drucken Sie einfach ohne newline
:
<your command> | awk 'NR > 1 { printf(",") } {printf "%s",$0}'