2015-01-27 13 views
77

Ich habe diese Jsonjq Verwendung analysieren und mehrere Felder in einem json seriell

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

Mit jq Ich möchte anzuzeigen seriell Vor- und Nachnamen angezeigt werden soll. Wie so -

Stevie Wonder 
Michael Jackson 

Dies ist, wie weit ich gekommen -

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

Aber es zeigt

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

Beachten Sie die folgende -

  1. die doppelten Anführungszeichen, die ich nicht wollen.
  2. Der Wagenrücklauf, den ich nicht will.
  3. Es ist durcheinander. Meine Abfrage zeigt zuerst alle Vornamen und dann alle Nachnamen an. Ich möchte jedoch das vorletzte, das vorletzte Paar.
+0

Eigentlich verwende ich die Befehlszeile JSON-Prozessor namens jq - http://stedolan.github.io/jq/manual/ – San

Antwort

115

Ich empfehle, mit String Interpolation:

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

reference

+4

das ist viel besser, wenn Ihre Daten Zahlen sind – ozOli

+1

warum funktioniert das? Wo kann ich mehr über die Syntax "\ (...)" finden? – spazm

+1

https://stedolan.github.io/jq/manual/#Stringinterpolation-%5C%28foo%29 –

88

Sie addition Strings verketten verwenden können.

Die Strings werden hinzugefügt, indem sie zu einer größeren Zeichenfolge zusammengefügt werden.

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

Um die JSON-Anführungszeichen zu entfernen, rufen Sie jq mit der Option -r auf, z. jq -r '.users [] | .first + "" + .last ' – peak

+1

+1, aber für meinen Anwendungsfall versuche ich zwei Zahlen in derselben Zeile zu formatieren.Dieser Ansatz schlägt fehl, weil "' "' nicht zu einer Zahl hinzugefügt werden kann. Erics Antwort gibt ein besseres Ergebnis für diesen Fall. – Synesso

+1

@Synesso: '(.numA | tostring) +" "+ (.numB | tostring)' sollte funktionieren. Oder verwenden Sie stattdessen die String-Interpolation: '" \ (. NumA) \ (. NumB) "'. –

5

Während beide der oben genannten Antworten funktionieren gut, wenn Schlüssel, Wert-Strings sind, hatte ich eine Situation, einen String und Integer (jq Fehler unter Verwendung der obigen Ausdrücke)

Anforderung anhängen: Zur Konstruktion eine uRL aus unter json

[email protected]>curl http://192.168.99.103:8500/v1/catalog/service/apache-443 | jq .[0] 
    % Total % Received % Xferd Average Speed Time Time  Time Current 
           Dload Upload Total Spent Left Speed 
100 251 100 251 0  0 155k  0 --:--:-- --:--:-- --:--:-- 245k 
{ 
    "Node": "myconsul", 
    "Address": "192.168.99.103", 
    "ServiceID": "4ce41e90ede4:compassionate_wozniak:443", 
    "ServiceName": "apache-443", 
    "ServiceTags": [], 
    "ServiceAddress": "", 
    "ServicePort": 1443, 
    "ServiceEnableTagOverride": false, 
    "CreateIndex": 45, 
    "ModifyIndex": 45 
} 

Lösung:

curl http://192.168.99.103:8500/v1/catalog/service/apache-443 | 
jq '.[0] | "http://" + .Address + ":" + "\(.ServicePort)"' 
+0

Beachten Sie, dass das Schließen der schließenden Klammer nicht erforderlich ist und irren würde. – nymo

+0

@ Nymo: Das ist nicht zu entkommen. '\ (...)' ist String-Interpolation. Hier verwandelt sich der numerische '.ServicePort' in einen String. Interpolation könnte anstelle der Zeichen "+" verwendet werden, um diese Lösung kürzer zu machen. –

0

bekam ich ziemlich nahe, was so etwas wie dieses

cat my.json | jq '.my.prefix[] | .primary_key + ":", (.sub.prefix[] | " - " + .sub_key)' | tr -d '"' 

dessen Ausgang nahe genug ist, um zu YAML für mich in der Regel importieren Sie es in anderen Werkzeugen ohne viel Problem indem ich wollte. (Ich bin immer noch auf der Suche nach einer Möglichkeit, eine Teilmenge der Eingabe json zu exportieren)