522 Stimmen

Verwendung von jq zum Analysieren und Anzeigen mehrerer Felder in einem JSON seriell

Ich habe dieses Json

{
    "users": [
        {
            "first": "Stevie",
            "last": "Wonder"
        },
        {
            "first": "Michael",
            "last": "Jackson"
        }
    ]
}

Mit jq möchte ich den Vornamen und Nachnamen nacheinander anzeigen. So -

Stevie Wonder
Michael Jackson

Das ist mein bisheriger Fortschritt -

jq '.users[].first, .users[].last'

Aber es zeigt

"Stevie"
"Michael"
"Wonder"
"Jackson"

Beachten Sie folgendes:

  1. Die doppelten Anführungszeichen, die ich nicht möchte.
  2. Der Zeilenumbruch, den ich nicht möchte.
  3. Es ist durcheinander. Meine Abfrage zeigt zuerst alle Vornamen und dann alle Nachnamen an. Ich möchte jedoch Vornamen-Nachnamen, Vornamen-Nachnamen-Pärchen.

719voto

Eric Hartford Punkte 14436

Ich empfehle die Verwendung von String-Interpolation:

jq '.users[] | "\(.first) \(.last)"'

Wir leiten das Ergebnis von .users[] weiter, um den String ".first .last" mithilfe von String-Interpolation zu generieren. Die Syntax \(foo) wird für die String-Interpolation in jq verwendet. So wird für das obige Beispiel "Stevie Wonder" (".users[].first .users[].second" arbeitet elementweise) und "Michael Jackson".

jq Referenz: String Interpolation

382voto

abraham Punkte 43978

Sie können Addition verwenden, um Zeichenfolgen zu verketten.

Zeichenfolgen werden durch Verknüpfung zu einer größeren Zeichenfolge hinzugefügt.

jq '.users[] | .first + " " + .last'

Das obige funktioniert, wenn sowohl first als auch last Zeichenfolgen sind. Wenn Sie verschiedene Datentypen (Zahl und Zeichenfolge) extrahieren, müssen wir sie in äquivalente Typen umwandeln. Siehe Lösung zu dieser Frage. Zum Beispiel.

jq '.users[] | .first + " " + (.number|tostring)'

84voto

ingomueller.net Punkte 3328

Zusätzlich zu dem, was andere vorgeschlagen haben, denke ich, dass es sich lohnt, zwei Optionen zu erwähnen.

Als CSV/TSV drucken

$ cat file.json | jq -r '.users[] | [.first, .last] | @tsv'
Stevie  Wonder
Michael Jackson

cat file.json | jq -r '.users[] | [.first, .last] | @csv'
"Stevie","Wonder"
"Michael","Jackson"

Der erste Ausdruck .users[] hebt die Objekte aus dem äußersten Array wie im Code in der Frage hervorgehoben hervor. Der nächste Ausdruck, [.first, .last], erstellt ein neues Array mit den Werten für jedes Eingabeobjekt, und der letzte Ausdruck verwendet die integrierten Funktionen @tsv und @csv, um alle Eingabearrays jeweils als tabellarisch getrennte und kommagetrennte Werte auszugeben.

Als JSON-Werte drucken

Ebenso ist es möglich, wieder JSON-Werte zu erstellen, was interessant ist, wenn Sie nur eine Teilmenge der Felder behalten möchten:

$ cat file.json | jq -c '.users[] | {first}'
{"first":"Stevie"}
{"first":"Michael"}

80voto

optman Punkte 901
jq '.users[]|.first,.last' | paste - -

20voto

Mein Ansatz wird sein (dein JSON-Beispiel ist nicht korrekt formatiert.. vermute, dass es nur ein Beispiel ist)

jq '.Front[] | [.Name,.Out,.In,.Groups] | join("|")'  front.json  > output.txt

Liefert etwas Ähnliches zurück

"new.domain.com-80|8.8.8.8|192.168.2.2:80|192.168.3.29:80 192.168.3.30:80"
"new.domain.com -443|8.8.8.8|192.168.2.2:443|192.168.3.29:443 192.168.3.30:443"

und grep das Ergebnis mit regulärem Ausdruck.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X