GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So analysieren und verschönern Sie JSON mit Linux-Befehlszeilentools

JSON ist ein leichtes und sprachunabhängiges Datenspeicherformat, das sich leicht in die meisten Programmiersprachen integrieren lässt und auch für Menschen leicht verständlich ist, natürlich wenn es richtig formatiert ist. Das Wort JSON steht für J avaS Krippe O Objekt N otation, obwohl es mit JavaScript beginnt und hauptsächlich zum Austausch von Daten zwischen Server und Browser verwendet wurde, aber jetzt in vielen Bereichen verwendet wird, einschließlich eingebetteter Systeme. Hier werden wir JSON mit Befehlszeilentools unter Linux analysieren und hübsch drucken. Es ist äußerst nützlich, um große JSON-Daten in einem Shell-Skript zu handhaben oder JSON-Daten in einem Shell-Skript zu manipulieren.

Was ist schöner Druck?

Die JSON-Daten sind so strukturiert, dass sie für Menschen etwas besser lesbar sind. In den meisten Fällen werden JSON-Daten jedoch in einer einzelnen Zeile gespeichert, auch ohne Zeilenendezeichen.

Offensichtlich ist das nicht sehr bequem zum manuellen Lesen und Bearbeiten.

Das ist, wenn hübscher Druck nützlich ist. Der Name ist ziemlich selbsterklärend und formatiert den JSON-Text neu, damit er für Menschen besser lesbar ist. Dies wird als JSON-Pretty-Printing bezeichnet .

JSON mit jq unter Linux parsen und hübsch drucken

JSON-Daten können mit Befehlszeilen-Textprozessoren wie awk geparst werden , sed und gerp . Tatsächlich ist JSON.awk ein awk-Skript, um dies zu tun. Es gibt jedoch einige spezielle Tools für denselben Zweck.

  1. jq oder jshon , JSON-Parser für die Shell, beide sind sehr nützlich.
  2. Shell-Skripte wie JSON.sh oder jsonv.sh um JSON in bash, zsh oder dash shell zu parsen.
  3. JSON.awk , JSON-Parser-awk-Skript.
  4. Python-Module wie json.tool .
  5. Unterstrich-cli , Node.js und Javascript basiert.

In diesem Tutorial konzentriere ich mich nur auf jq , ein ziemlich leistungsfähiger JSON-Parser für Shells mit erweiterten Filter- und Skriptfunktionen.

JSON hübscher Druck

JSON-Daten könnten in einem sein und für Menschen fast unlesbar sein, also um sie einigermaßen lesbar zu machen, ist JSON Pretty Printing hier.

Beispiel: A-Daten von jsonip.com , um eine externe IP-Adresse im JSON-Format zu erhalten, verwenden Sie curl oder wget Tools wie unten.

$ wget -cq http://jsonip.com/ -O -

Die eigentlichen Daten sehen so aus:

{"ip":"111.222.333.444","about":"/about","Pro!":"http://getjsonip.com"}

Jetzt hübsch drucken mit jq:

$ wget -cq http://jsonip.com/ -O - | jq '.'

Dies sollte wie unten aussehen, nachdem das Ergebnis mit jq gefiltert wurde.

{

   "ip": "111.222.333.444",

   "about": "/about",

   "Pro!": "http://getjsonip.com"

}

Das Gleiche könnte mit python json.tool gemacht werden Modul. Hier ist ein Beispiel:

$ cat anything.json | python -m json.tool

Diese Python-basierte Lösung sollte für die meisten Benutzer in Ordnung sein, ist aber nicht so nützlich, wenn Python nicht vorinstalliert ist oder nicht installiert werden konnte, wie z. B. auf eingebetteten Systemen.

Das Python-Modul json.tool hat jedoch einen entscheidenden Vorteil, es ist plattformübergreifend. Sie können es also nahtlos unter Windows, Linux oder Mac OS verwenden.

Empfohlene Lektüre:

  • Prettyping – Machen Sie die Ausgabe des Ping-Befehls hübscher und leichter lesbar

So parsen Sie JSON mit jq

Zuerst müssen Sie jq installieren, es wird bereits von den meisten GNU/Linux-Distributionen übernommen, installieren Sie es mit den entsprechenden Paketinstallationsbefehlen.

Unter Arch Linux:

$ sudo pacman -S jq

Unter Debian, Ubuntu, Linux Mint:

$ sudo apt-get install jq

Auf Fedora:

$ sudo dnf install jq

Unter openSUSE:

$ sudo zypper install jq

Informationen zu anderen Betriebssystemen oder Plattformen finden Sie in den offiziellen Installationsanweisungen.

Grundlegende Filter und Kennungen von jq

jq könnte die JSON-Daten entweder von stdin lesen oder eine Datei . Sie müssen je nach Situation beide verwenden.

Das einzelne Symbol von . ist der grundlegendste Filter. Diese Filter werden auch als Objektkennungsindex bezeichnet . Mit einem einzigen . Zusammen mit jq wird die JSON-Eingabedatei im Grunde hübsch gedruckt.

Einfache Anführungszeichen - Sie müssen nicht immer das einfache Anführungszeichen verwenden. Wenn Sie jedoch mehrere Filter in einer einzigen Zeile kombinieren, müssen Sie diese verwenden.

Doppelte Anführungszeichen - Sonderzeichen wie @ müssen eingeschlossen werden , # , $ innerhalb von zwei doppelten Anführungszeichen, wie in diesem Beispiel jq .foo."@bar"

Rohdatendruck - Wenn Sie aus irgendeinem Grund nur die endgültigen geparsten Daten benötigen, die nicht in doppelte Anführungszeichen eingeschlossen sind, verwenden Sie das Flag -r mit dem Befehl jq wie folgt. - jq -r .foo.bar .

Spezifische Daten parsen

Um einen bestimmten Teil von JSON herauszufiltern, müssen Sie in die Datenhierarchie der hübsch gedruckten JSON-Datei schauen.

Ein Beispiel für JSON-Daten aus Wikipedia:

{

  "firstName": "John",

  "lastName": "Smith",

  "age": 25,

  "address": {

    "streetAddress": "21 2nd Street",

    "city": "New York",

    "state": "NY",

    "postalCode": "10021"

},

  "phoneNumber": [

{

  "type": "home",

  "number": "212 555-1234"

},

{

  "type": "fax",

  "number": "646 555-4567"

}

],

  "gender": {

  "type": "male"

  }

}

Ich werde diese JSON-Daten in diesem Tutorial als Beispiel verwenden und sie als sample.json speichern .

Nehmen wir an, ich möchte die Adresse aus der Datei sample.json herausfiltern. Der Befehl sollte also wie folgt lauten:

$ jq .address sample.json

Beispielausgabe:

{

  "streetAddress": "21 2nd Street",

  "city": "New York",

  "state": "NY",

  "postalCode": "10021"

}

Nehmen wir wieder an, ich möchte die Postleitzahl, dann muss ich einen weiteren Objektidentifikator-Index hinzufügen , also ein weiterer Filter.

$ cat sample.json | jq .address.postalCode

Beachten Sie auch, dass bei den Filtern zwischen Groß- und Kleinschreibung unterschieden wird und Sie müssen genau dieselbe Zeichenfolge verwenden, um eine sinnvolle Ausgabe anstelle von null zu erhalten.

Elemente aus JSON-Array parsen

Elemente des JSON-Arrays sind in eckige Klammern eingeschlossen und zweifellos sehr vielseitig zu verwenden.

Um Elemente aus einem Array zu parsen, müssen Sie den []identifier verwenden zusammen mit anderen Objekt-ID-Index.

In diesen JSON-Beispieldaten werden die Telefonnummern in einem Array gespeichert. Um den gesamten Inhalt aus diesem Array abzurufen, müssen Sie nur die Klammern verwenden, wie in diesem Beispiel.

$ jq .phoneNumber[] sample.json

Angenommen, Sie möchten nur das erste Element des Arrays, verwenden Sie dann die Array-Objektnummern beginnend bei 0, verwenden Sie für das erste Element [0] , für die nächsten Elemente sollte es bei jedem Schritt um eins erhöht werden.

$ jq .phoneNumber[0] sample.json

Skriptbeispiele

Nehmen wir an, ich möchte nur die Nummer für zu Hause, nicht die gesamten JSON-Array-Daten. Hier erweist sich das Scripting innerhalb des jq-Befehls als nützlich.

$ cat sample.json | jq -r '.phoneNumber[] | select(.type == "home") | .number'

Hier leite ich zuerst die Ergebnisse eines Filters an einen anderen weiter, verwende dann das select-Attribut, um einen bestimmten Datentyp auszuwählen, und leite das Ergebnis wiederum an einen anderen Filter weiter.

Das Erklären aller Arten von jq-Filtern und Skripten würde den Rahmen und Zweck dieses Tutorials sprengen. Es wird dringend empfohlen, das unten angegebene JQ-Handbuch zum besseren Verständnis zu lesen.


Linux
  1. Programmieren mit Bash:Syntax und Tools

  2. So finden Sie Dateien mit SUID- und SGID-Berechtigungen in Linux

  3. Flatpak unter Linux:Was es ist und wie man Apps damit installiert

  4. So komprimieren Sie Dateien und Verzeichnisse unter Linux (mit Beispielen)

  5. So drucken Sie eine JSON-Datei im Linux-Terminal

So testen Sie Linux-Befehle und -Programme über die Befehlszeile

So teilen Sie Dateien sicher über die Befehlszeile mit ffsend in Linux

So zeigen Sie die Festplattennutzung mit Duf unter Linux und Unix an

So sichern und wiederherstellen Sie ein Linux-System mit Timeshift

So arbeiten Sie mit Vordergrund- und Hintergrundprozessen unter Linux

So löschen Sie Dateien und Verzeichnisse mit der Linux-Befehlszeile