Ich habe diesen json text:
{
"buildStatus" : {
"status" : "ERROR",
"conditions" : [{
"status" : "OK",
"metricKey" : "bugs"
}, {
"status" : "ERROR",
"metricKey" : "test_success_density"
}, {
"status" : "OK",
"metricKey" : "vulnerabilities"
}
],
"periods" : []
}
}
Ich möchte den Gesamtstatus des buildStatus extrahieren, dh die erwartete Ausgabe war "ERROR"
"buildStatus" : {
"status" : "ERROR",
....
}
Ich habe den folgenden sed-Ausdruck ausprobiert, aber er funktioniert nicht. Er gibt Folgendes zurück OK
:
status= sed -E 's/.*\"buildStatus\":.*\"status\":\"([^\"]*)\",.*/\1/' jsonfile
Was mache ich falsch?
quelle
jq
:jq -r .buildStatus.status
Arbeit für
jq
:Kann gekürzt werden auf:
-r
(--raw-output
) gibt den String ohnejson
String-Formatierung aus, dh ohne Anführungszeichen.Beispiel:
Wenn noch nicht installiert, installieren Sie es mit (im Universe-Repository verfügbar):
quelle
Wie bereits erwähnt, ist das Parsen komplex strukturierter Daten mit einer geeigneten API vorzuziehen. Python hat ein
json
Modul dafür, das ich persönlich häufig in meinen Skripten verwende, und es ist ziemlich einfach, die gewünschten Felder zu extrahieren:Was hier passiert, ist, dass wir die Eingabedatei zu Pythons Standard umleiten und das mit lesen
json.load()
. Das wird ein Python-Wörterbuch mit dem Schlüssel "buildStatus" und es enthält ein anderes Python-Wörterbuch mit dem Schlüssel "status". Wir drucken also lediglich den Wert eines Schlüssels in einem Wörterbuch aus, der in einem anderen Wörterbuch gespeichert ist. Ziemlich Einfach.Abgesehen von der Einfachheit ist ein weiterer Vorteil, dass Python und diese API alle vorinstalliert sind und standardmäßig mit Ubuntu geliefert werden.
quelle
Sie können dies in der Tat tun
sed
, aber ich rate Ihnen dringend, eine ausgefeiltere Sprache zu verwenden, die Tools für die Verarbeitung von JSON-Daten enthält. Sie könnten zum Beispiel Perl oder Python ausprobieren.Nun, in Ihrem einfachen Beispiel, ist alles, was Sie wollen, das erste Vorkommen von
"status"
, also können Sie Folgendes tun:Der Trick besteht darin
-n
, das Drucken zu vermeiden. Wenn die Linie mitstatus
(/status/
) übereinstimmt , entfernen Sie alles außer dem gewünschten Teils/.*:\s*"(.*)",/\1/
,p
drucken die Linie und schließen sieq
.Persönlich finde ich diesen äquivalenten grep-Befehl viel einfacher:
Oder dieses:
Im Ernst, wenn Sie vorhaben, JSON-Dateien zu analysieren, versuchen Sie dies nicht manuell. Verwenden Sie einen richtigen JSON-Parser.
quelle
grep -m 1 status file.json | tr -cd '[[:alnum:]]:' | cut -f2 -d':'
Nicht sagen , Sie sollten verwenden
sed
(Ich glaube , jemand Downvoted mich gerade für nicht obligatorisch Vorbehalt zu schreiben) , aber, wenn Sie etwas auf der suchen müssen nächste Zeile ,buildStatus
wie Sie scheinen in Ihrem eigenen Versuch zu versuchen, Sie sagen müssensed
lesen die nächste Zeile mit demN
BefehlAnmerkungen:
-n
drucke nichts aus, bis wir danach fragen-r
benutze ERE (wie-E
)/buildStatus/N
Finde dieses Muster und lies auch die nächste Zeiles/old/new/
ersetzenold
mitnew
.*
Beliebige Anzahl beliebiger Zeichen in der Zeile\n
Neue Zeile: "(.*)",
Speichern Sie alle Zeichen zwischen: "
und",
\1
Rückverweis auf gespeichertes Musterp
Drucken Sie den Teil, an dem wir gearbeitet habenquelle
Es gibt eine typische Erklärung dafür, warum
sed
und ähnliche Textstrom-Verarbeitungstools nicht gut dafür geeignet sind, strukturierte Daten wie JSON und XML zu analysieren. Ich habe das nicht zur Hand, aber es ist da draußen, und ich glaube, der Punkt ist, dass die Ausdrücke, die in allen, aber wahrscheinlich in den wenigsten Situationen benötigt werden, schnell sehr komplex werden, während alternative Tools, die speziell zum Analysieren der Struktur entwickelt wurden, komplexer sind elegant, lesbar und effizient bei der gleichen Analyse.Wie muru in einem Kommentar formuliert hat ,
jq
sollte das das richtige Werkzeug für den Job sein. Ich kann auch dafür bürgen, dass es persönlich sehr aufgeregt ist, wenn ich sehe, dass es mehrere Male ersetzt wird, wenn ich versucht habe, die gleichen Daten zu analysieren, ohne fast keinen oder belastenden Erfolg. Es enthält sogar umfangreiche Funktionen zum Formatieren und anderweitigen Steuern der Ausgabe. Ich bevorzuge esjsontool
aus einem oder mehreren Gründen, die ich derzeit vergesse.Byte Commander scheint
jshon
in einer anderen Antwort zu empfehlen . Ich habe dieses Tool nicht benutzt, aber es erinnert mich anxmlstarlet
und seine Syntax, auch mit einer anpassbaren Präsentation für die Ausgabe.quelle
jsontool
jq
dass muru und heemayl beschreiben, dass es bereits Beispiele gibt, und schreibe einfach die GründeNur ein weiteres Json-Tool namens json ( https://github.com/trentm/json )
Diese Fallstudie ist irreführend: Es sieht so aus, als würden Werkzeuge nicht funktionieren. Sie können auch
json
zum Ändern von JSON-Dateien Folgendes verwenden:oder auch...
Dokumentation unter: http://trentm.com/json/
wenn nicht installiert:
npm install -g json
quelle