So analysieren Sie eine JSON -Datei von der Linux -Befehlszeile mit JQ
- 902
- 213
- Janin Pletsch
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
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