Fügen Sie die jq-Ausgabe in eine durch Kommas getrennte Zeichenfolge zusammen.

Fügen Sie die jq-Ausgabe in eine durch Kommas getrennte Zeichenfolge zusammen.

Ich versuche es mit curleiner 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

pasteist 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 @csvOperator 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, @csvwodurch 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}'

verwandte Informationen