Wie kann ich die JSON-Ausgabe in der Shell analysieren?
Beispielsweise bietet Amazon Web Services eine CLI zum Abrufen des Status Ihrer Instanzen:
$ aws ec2 describe-instances <my_instance_id>
Der Befehl gibt jedoch eine JSON-Zeichenfolge zurück. Die Ausgabe dieses Befehls sieht folgendermaßen aus:
$ aws ec2 describe-instances x12345
{
"Reservations" :
{
"OwnerId": "1345345"
"Groups": [],
"SecurityGroups": [
{
"Foo" : "yes"
"Bar" : "no
}
]
}
}
Gibt es integrierte Shells, mit denen die JSON-Ausgabe analysiert werden kann?
Zum Beispiel möchte ich in einer Shell-Variablen FOO
Folgendes erfassen output["Reservations"]["SecurityGroups"][0]{"Foo"}
.
Falls es hilft, bin ich speziell an Lösungen interessiert, die von Zsh aus funktionieren könnten.
--output text
Sie diese Option, wenn Sie die Shell analysieren möchten, ohne externe Tools wie verwenden zu müssenjshon
.jshon
zum ersten Mal davon gehört habe, bin ich Ihrem Link gefolgt. Nachdem ich das gelesen habe, kann ich nur sagen, dass ich sehr erfreut war, dass ich zufällig zuerst davon gehört und es installiert habejq
. Ich denke, Sie möchten vielleicht auch davon hören, wenn Sie es noch nicht getan haben - es stört nicht alle diese Befehlszeilenschalter und kann seine eigenen regulären Ausdrücke ausführen - es ermöglicht Ihnen sogar, Funktionen und Variablen zu deklarieren, wenn Sie dies wünschen. Sehen Sie die Antwort hier darüber, wenn Sie interessiert sind.Antworten:
So wie ich es verstehe, suchen Sie nach dem Wert von "Foo". Dies ist mit dem Shell-Befehlszeilentool sehr einfach
jq
. Es ist so ähnlich,sed
dass es eine eigene Art von Parser-Sprache implementiert. Anhand Ihres Beispiels:jq
kannyes
so einfach werden wie:AUSGABE
Sie können mithilfe der
.dot
Notation durch einen Objekt-Hash oder eine Wörterbuchliste gehen , und indizierte Arrays können einfacher mit numerischen Indizes in eckigen Klammern indiziert werden, wie Sie wahrscheinlich vermutet haben. Im obigen Befehl verwende ich das leere Indexformular, um anzugeben, dass alle iterierbaren Elemente dieser Ebene erweitert werden sollen. Das kann auf diese Weise einfacher zu verstehen sein:... was alle Werte für die Elemente der zweiten Ebene im Hash aufschlüsselt und mich ...
Dies kratzt kaum an der Oberfläche in Bezug auf
jq
die Fähigkeiten. Es ist ein immens leistungsfähiges Tool zum Serialisieren von Daten in der Shell, es wird zu einer einzigen ausführbaren Binärdatei im klassischen Unix-Stil kompiliert, es ist sehr wahrscheinlich über den Paketmanager für Ihre Distribution verfügbar und es ist sehr gut dokumentiert. Bitte besuchen Sie diegit
Seite und überzeugen Sie sich selbst.Übrigens könnte eine andere Möglichkeit, geschichtete Daten in Angriff zu nehmen
json
- zumindest um eine Vorstellung davon zu bekommen, mit was Sie arbeiten - darin bestehen, in die andere Richtung zu gehen und die.dot
Notation zu verwenden, um alle Werte auf allen Ebenen aufzuteilen, z.Aber weitaus besser wäre es wahrscheinlich, nur eine der vielen Erkennungs- oder Suchmethoden zu verwenden,
jq
die für die verschiedenen Knotentypen angeboten werden.quelle
Dies ist eine Antwort auf Ihr Ziel, aber nicht auf Ihre Frage. Das heißt, Sie können Ihr Ziel erreichen, ohne einen JSON-Parser zu verwenden.
Das AWS cli util kann nur ausgewählte Felder mit dem
--query
Argument ausgeben . Dies ist hier dokumentiert .Zum Beispiel:
Sie können sogar mehrere Felder auswählen, wenn Sie möchten:
Sie können auch mehrere übereinstimmende Strukturen anzeigen:
quelle