So analysieren Sie eine JSON -Datei von der Linux -Befehlszeile mit JQ

So analysieren Sie eine JSON -Datei von der Linux -Befehlszeile mit JQ

Der JSON (JavaScript -Objektnotation) Format wird häufig zur Darstellung von Datenstrukturen verwendet und wird häufig zum Austausch von Daten zwischen verschiedenen Schichten einer Anwendung oder durch die Verwendung von API -Aufrufen verwendet. Wir wissen wahrscheinlich, wie man mit den am häufigsten verwendeten Programmiersprachen wie Parsen JSON mit Python interagieren, aber was ist, wenn wir mit der Befehlszeile oder in einem Bash-Skript mit ihm interagieren müssen? In diesem Artikel werden wir sehen, wie wir eine solche Aufgabe erfüllen können, indem wir die verwenden JQ Nützlichkeit und wir werden seine grundlegende Nutzung lernen.

In diesem Tutorial lernen Sie:

  • So installieren Sie JQ in den am häufigsten verwendeten Linux -Verteilungen oder kompilieren Sie es aus der Quelle
  • So verwenden Sie JQ, um JSON-formatierte Daten zu analysieren
  • Wie man Filter mit "" und "|" kombiniert
  • So verwenden Sie die Länge, die Schlüssel, die Have und die Kartenfunktionen



Softwareanforderungen und Konventionen verwendet

Softwareanforderungen und Linux -Befehlszeilenkonventionen
Kategorie Anforderungen, Konventionen oder Softwareversion verwendet
System Verteilungsunabhängige
Software Die JQ -Anwendung
Andere Vertrautheit mit JSON -Daten und der Bash -Shell
Konventionen # - erfordert, dass gegebene Linux -Befehle mit Root -Berechtigungen entweder direkt als Stammbenutzer oder mit Verwendung von ausgeführt werden können sudo Befehl
$ - Erfordert, dass die angegebenen Linux-Befehle als regelmäßiger nicht privilegierter Benutzer ausgeführt werden können

Installation

Der JQ Das Dienstprogramm ist in allen wichtigen Linux -Distributions -Repositories enthalten. Daher ist die Installation sehr einfach: Wir müssen nur unseren bevorzugten Paketmanager verwenden. Wenn wir Debian oder eine Debian-basierte Verteilung wie Ubuntu oder Linux Mint verwenden, können wir verwenden geeignet:

$ sudo apt install JQ


Wenn wir die Red Hat -Familie von Verteilungen wie Fedora, CentOS oder Rhel bevorzugen, können wir installieren JQ über die DNF Paketmanager (in jüngsten Versionen dieser Verteilungen ersetzte es Yum). Um das Paket zu installieren, würden wir ausführen:

$ sudo dnf install JQ

Installation JQ auf Archlinux ist genauso einfach. Der Vertriebspaketmanager ist Pacman, und das Paket ist im Community -Repository erhältlich. Wir können die Installation mit dem folgenden Befehl ausführen:

$ sudo pacman -s install JQ

Wenn wir nicht können oder aus irgendeinem Grund kein vorgefertigtes Binärpaket verwenden möchten, können wir JQ aus Quelle kompilieren. In
Die folgenden Zeilen beschreiben wir die erforderlichen Schritte.

Bauen und Installieren von Quelle

Um JQ aus der Quelle zu erstellen und zu installieren, müssen wir als erstes einen Release -Tarball herunterladen. Im Moment von
Schreiben, die neueste verfügbare Veröffentlichung ist 1.6. Um den Tarball herunterzuladen, ohne das Terminal zu verlassen, können wir verwenden wget:

$ wget https: // github.com/stedolan/jq/releases/download/jq-1.6/JQ-1.6.Teer.gz

Sobald der Download abgeschlossen ist, müssen wir den Tarball dekomprimieren und extrahieren:

$ tar -xzf jq -1.6.Teer.gz

Der nächste Schritt besteht darin, die einzugeben JQ-1.6 Verzeichnis, erstellt als Ergebnis des letzten Befehls:

$ CD JQ-1.6

Um den Quellcode zu kompilieren, benötigen wir die folgenden Dienstprogramme:

  • GCC
  • Automake
  • libtool
  • machen

Um die Software zu erstellen, die wir ausführen:

$ autoreconf -fi $ ./konfigurieren && make && sudo make installieren 
Kopieren

Der Installation machen Der Befehl standardmäßig führt die Installation von Binärdateien in der /usr/local/bin Verzeichnis und Bibliotheken in /usr/local/lib. Wenn wir die Installation anpassen und diese Verzeichnisse ändern möchten, müssen wir ein anderes Präfix angeben, indem wir die verwenden --Präfix Option beim Starten der ./konfigurieren Skript.

Um die Software beispielsweise nur für einen bestimmten Benutzer zu installieren, könnten wir die übergeben $ Home/.lokal Verzeichnis als Präfix: In diesem Fall würden Binärdateien in installiert in $ Home/.Lokal/Mülleimer und Bibliotheken in die $ Home/.Lokal/lib; Mit einer solchen Konfiguration wäre es nicht erforderlich, die zu starten Installation machen Befehl mit administrativen Privilegien. Wenn Sie wissen möchten, wie Sie die Software -installierte Formularquelle besser organisieren möchten, können Sie unseren Artikel über das Dienstprogramm GNU Stow überprüfen.

Verwendung

Sobald wir haben JQ Installiert können wir es verwenden, um JSON -Dateien aus der Befehlszeile zu analysieren. Für dieses Tutorial arbeiten wir mit einer einfachen Datenstruktur, die einige Details zu drei Charakteren aus Lord of the Rings Book enthält. Die Daten werden in die gespeichert Figuren.JSON Datei.

Der JQ Das Dienstprogramm funktioniert, indem Filter auf einen Strom von JSON -Daten angewendet werden. Als erstes werden wir den einfachsten Filter verwenden, ., Dies gibt die Eingangsdaten unverändert, aber ziemlich gedruckt zurück. Für dieses Merkmal kann es verwendet werden, um Daten lesbarer zu formatieren:

$ jq . Figuren.JSON

Der obige Befehl erzeugt die folgende Ausgabe:

"Zeichen": ["Name": "Aragorn", "Race": "Man", "Name": "Gimli", "Race": "Zwerg", "Name": "Legolas" , "Rasse": "Elf"] 
Kopieren

Nehmen wir nun an, wir möchten die Daten filtern, um nur den Wert zu erhalten, der dem zugeordnet ist Figuren Taste. Um die Aufgabe zu erfüllen, geben wir den Namen des Schlüssels an und erhalten ihren Wert (oder Null Wenn es nicht existiert):

$ jq .Charaktere Charaktere.JSON

In unserem Beispiel ist der Wert, der dem Schlüssel „Zeichen“ zugeordnet ist Array, Wir erhalten also das folgende Ergebnis:

["Name": "Aragorn", "Race": "Man", "Name": "Gimli", "Race": "Zwerg", "Name": "Legolas", "Race": "Elf"]
Kopieren

Was ist, wenn wir nur das erste Element des Arrays bekommen wollen?? Wir müssen nur den richtigen Index daraus „extrahieren“. Zu wissen, dass Arrays sind Nullbasiert, Wir können rennen:

$ jq .Zeichen [0] Zeichen.JSON


Der Befehl gibt uns:

"Name": "Aragorn", "Rasse": "Mann" 
Kopieren

Wir können auch eine Scheibe des Arrays erhalten. Sagen Sie zum Beispiel, wir wollen nur die ersten beiden Elemente bekommen. Wir rennen:

$ jq .Zeichen [0: 2] Zeichen.JSON

Der Befehl gibt uns das folgende Ergebnis:

["Name": "Aragorn", "Rasse": "Mann", "Name": "Gimli", "Rasse": "Zwerg"] 
Kopieren

Schneiden funktioniert auch auf Saiten. Wenn wir also rennen:

$ jq .Zeichen [0].Name [0: 2] Zeichen.JSON

Wir erhalten eine Scheibe (die ersten beiden Buchstaben) der String „Aragorn“: "Ar".

Zugriff auf Arrayelemente getrennt zugreifen

In den obigen Beispielen haben wir den Inhalt des Array „Charaktere“ gedruckt, die aus drei Objekten bestehen, die Fantasy -Charaktere beschreiben. Was ist, wenn wir über das Array iterieren wollen?? Wir müssen machen, damit Elemente, die darin enthalten sind [] ohne einen Index bereitzustellen:

$ jq .Zeichen [] Zeichen.JSON

Die Ausgabe des Befehls ist:

"Name": "Aragorn", "Rasse": "Mann" "Name": "Gimli", "Rasse": "Zwerg", "Waffe": "Axe" "Name": "Legolas" , "Rasse": "Elf" 
Kopieren

In diesem Fall haben wir 3 Ergebnisse erhalten: die im Array enthaltenen Objekte. Die gleiche Technik kann verwendet werden, um die Werte eines Objekts zu iterieren, in diesem Fall das erste, das im Array „Zeichen“ enthalten ist:

$ jq .Zeichen [0] [] Zeichen.JSON

Hier erhalten wir das folgende Ergebnis:

"Aragorn" "Mann" 
Kopieren

Das "," und "|" Betreiber

Das "," und "|" Betreiber werden beide verwendet, um zwei oder mehr Filter zu kombinieren, aber sie arbeiten auf unterschiedliche Weise. Wenn zwei Filter durch ein Komma getrennt werden, werden sie beide getrennt auf die angegebenen Daten angewendet und lassen uns zwei verschiedene Ergebnisse erhalten. Lassen Sie uns ein Beispiel sehen:

$ jq '.Zeichen [0], .Zeichen [2] 'Zeichen.JSON

Die in den Zeichen enthaltenen JSON-formatierten Daten.Die JSON -Datei wird zuerst mit gefiltert .Zeichen [0] und dann mit .Charaters [2], Um das erste und das dritte Element des "Charakters" -Array zu bekommen. Durch Ausführen des obigen Befehls erhalten wir zwei getrennt Ergebnisse:

"Name": "Aragorn", "Race": "Man" "Name": "Legolas", "Race": "Elf"
Kopieren

Das "|" Der Bediener arbeitet anders in einer Weise, die einem Unix -Rohr ähnelt. Der vom Filter links vom Bediener erzeugte Ausgang wird als Eingang an den Filter rechts vom Bediener übergeben. Wenn ein Filter links vom Bediener mehrere Ergebnisse erzielt, wird der Filter rechts vom Bediener auf jeden von ihnen angewendet:

$ jq '.Zeichen [] | .Nennen Sie Zeichen.JSON

In diesem Beispiel haben wir zwei Filter. Links vom Bediener haben wir das .Figuren[] Filter, das wie wir zuvor gesehen haben, lassen Sie uns die Elemente des Arrays „Charaktere“ als separate Ergebnisse erhalten. In unserem Fall ist jedes Ergebnis ein Objekt mit dem "Name" Und "Wettrennen" Eigenschaften. Der .Name Filter rechts von der | Der Bediener wird auf jedes der Objekte angewendet, sodass wir das folgende Ergebnis erhalten:

"Aragorn" "Gimli" "Legolas"
Kopieren

Funktionen

Das JQ -Dienstprogramm enthält einige sehr nützliche Funktionen, die wir auf die formatierten JSON -Daten anwenden können. Wir werden jetzt einige von ihnen sehen: Länge, Schlüssel, hat Und Karte.



Die Längenfunktion

Der erste, über den wir sprechen werden, ist Länge, Was, wie der Name schon sagt, die Länge von Objekten, Arrays und Strings abrufen. Die Länge der Objekte ist die Anzahl ihrer Schlüsselwertpaare; Die Länge der Arrays wird durch die Anzahl der Elemente dargestellt, die sie enthalten; Die Länge einer Zeichenfolge ist die Anzahl der Zeichen, aus denen sie zusammengesetzt ist. Lassen Sie uns sehen, wie die Funktion verwendet wird. Angenommen, wir wollen die Länge des Arrays „Charaktere“ wissen, wir rennen:

$ jq '.Charaktere | Länge 'Zeichen.JSON

Wie erwartet erhalten wir 3 Als Ergebnis, da es die Anzahl der Elemente im Array ist. Auf die gleiche Weise, um die Länge des ersten Objekts im Array zu erhalten, konnten wir ausführen:

$ jq '.Zeichen [0] | Länge 'Zeichen.JSON

Diesmal erhalten wir 2 Als Ergebnis, da es sich um die Anzahl der im Objekt enthaltenen Wertpaare handelt. Wie wir bereits sagten, gibt dieselbe Funktion, die auf eine Zeichenfolge angewendet wird, die Anzahl der darin enthaltenen Zeichen zurück. So läuft beispielsweise:

$ jq '.Zeichen [0].Name | Länge 'Zeichen.JSON

Wir erhalten 7 Als Ergebnis ist die Länge der String „Aragorn“.

Die Tastenfunktion

Der Schlüssel Funktion kann auf Objekte oder Arrays angewendet werden. Im ersten Fall gibt es ein Array zurück, das enthält
Die Objektschlüssel:

$ jq '.Zeichen [0] | Keys -Charaktere.Json ["Name", "Race"]
Kopieren

Wenn es auf ein Array angewendet wird, gibt es ein weiteres Array zurück, das die Indizes des ersten enthält:

$ jq '.Charaktere | Keys -Charaktere.JSON [0, 1, 2] 
Kopieren

Der Schlüssel Die Funktion gibt die sortierten Elemente zurück: Wenn wir möchten, dass die Elemente in Insertionsreihenfolge zurückgegeben werden, können wir die verwenden Keys_unsorted stattdessen Funktion.

Überprüfen Sie, ob ein Objekt einen Schlüssel hat

Eine sehr häufige Operation, die wir möglicherweise mit einem Objekt ausführen möchten, ist die Überprüfung, ob es einen bestimmten Schlüssel enthält. Um diese Aufgabe zu erfüllen, können wir die verwenden hat Funktion. Um beispielsweise zu überprüfen, ob das Hauptziel unserer JSON-formatierten Daten den Schlüssel „Waffen“ enthält, können wir ausführen:

$ jq 'hat ("Waffen") Charaktere.JSON False
Kopieren

In diesem Fall kehrte die Funktion wie erwartet zurück FALSCH Da das Objekt nur den Schlüssel „Zeichen“ enthält:

$ jq 'hat ("Charaktere")' Charaktere.Json wahr
Kopieren

Bei der Anwendung auf Arrays gibt die Funktion true zurück, wenn das Array ein Element am angegebenen Index hat oder ansonsten falsche:

$ jq '.Charaktere | hat (3) Charaktere.JSON False
Kopieren

Das Array „Charaktere“ hat nur 3 Elemente; Arrays sind nullisch indexiert. Überprüfen Sie, ob das Array als ein Element dem Index zugeordnet ist 3 kehrt zurück FALSCH.

Die Kartenfunktion

Mit der Kartenfunktion können wir einen Filter auf jedes Element eines bestimmten Arrays anwenden. Angenommen, wir möchten die Existenz des "Namens" -Staste in jedem der im Array "Zeichen" enthaltenen Objekte überprüfen. Wir können das kombinieren Karte Und hat Funktionen auf diese Weise:

$ jq '.Charaktere | Karte (Has ("Name") 'Zeichen.JSON [wahr, wahr, wahr] 
Kopieren

Schlussfolgerungen

In diesem Artikel kratzen wir kaum die Oberfläche der von der angebotenen Merkmale JQ Dienstprogramm, mit dem wir jSON-formatierte Daten aus der Befehlszeile analysieren und manipulieren können. Wir haben die grundlegende Verwendung des Programms gelernt, wie das "," und "|" Die Operatoren arbeiten und wie die Länge, die Schlüssel, die Funktionen und die Kartenfunktionen jeweils die Lenghts von Arrays, Zeichenfolgen und Objekten erhalten, Objektschlüssel oder Array -Indizes erhalten, ob ein Schlüssel in einem Objekt existiert oder ob ein Array hat ein Element am angegebenen Index und wenden Sie einen Filter oder eine Funktion auf jedes Element eines Arrays an. Alle entdecken JQ kann tun, gehen und sich das Programmhandbuch ansehen!

Verwandte Linux -Tutorials:

  • Wie man mit der Woocommerce -REST -API mit Python arbeitet
  • Dinge zu installieren auf Ubuntu 20.04
  • Einführung in JavaScript -Schleifen
  • Wie man Systemanrufe verfolgt, die durch einen Prozess mit Strace auf…
  • Mastering -Bash -Skriptschleifen beherrschen
  • Eine Einführung in Linux -Automatisierung, Tools und Techniken
  • Big Data Manipulation zum Spaß und Gewinn Teil 1
  • Verschachtelte Schleifen in Bash -Skripten
  • Dinge zu tun nach der Installation Ubuntu 20.04 fokale Fossa Linux
  • So verwenden Sie ein Bash -Skript, um Ihre Python -Skripte auszuführen