So verwenden Sie den Befehl jq zum Verarbeiten von JSON in Linux
Jq ist ein leistungsstarkes und äußerst flexibles Parserprogramm, das JSON-Daten aus Dateien und UNIX-Pipes streamen und filtern kann. Dieser Artikel vermittelt Ihnen die Grundlagen von jq, präsentiert Codebeispiele sowie einige alternative Implementierungen, die Sie noch heute installieren können.
Wofür wird jq verwendet?
Die häufigste Verwendung für jq ist die Verarbeitung und Bearbeitung von JSON-Antworten von Software-as-a-Service (SaaS)-APIs. Sie können jq beispielsweise zusammen mit cURL verwenden, um auf die API-Endpunkte von Digitalocean zuzugreifen und Ihre Kontodetails abzurufen.
Abgesehen davon ist jq auch ein leistungsstarkes Dienstprogramm zum Verwalten großer JSON-Dateien. Einige der heute beliebtesten Datenbankprogramme wie MongoDB, PostgreSQL und MySQL unterstützen JSON als Möglichkeit zum Speichern von Daten. Wenn Sie jq lernen, können Sie daher besser verstehen, wie diese Datenbanksysteme funktionieren.
Installieren und Verwenden von jq
Um mit jq zu beginnen, installieren Sie das Binärpaket auf Ihrem System:
Suchen Sie einen offenen API-Endpunkt, an dem Sie jq testen können. In meinem Fall werde ich die IP-Checker-API von ipinfo.io verwenden.
Der einfachste Filter für jq ist der Punktfilter (.). Dieser gibt die JSON-Antwort so aus, wie jq sie von seiner Standardeingabe erhalten hat:
Ein weiterer grundlegender Filter ist das Pipe-Symbol (|). Dies ist ein spezieller Filter, der die Ausgabe eines Filters als Eingabe eines anderen übergibt:
Der Wert nach dem Pipe-Operator ist der „Object Identifier-Index“. Dieser durchsucht Ihre JSON-Eingabe nach allen Variablen, die mit ihrem Text übereinstimmen, und gibt deren Wert auf dem Terminal aus. In diesem Fall suche ich nach dem Wert des Schlüssels „ip:“.
Nachdem die Grundlagen geklärt sind, zeigen Ihnen die folgenden Abschnitte einige Tricks, die Sie mit jq ausführen können.
1. Erstellen eines einfachen Feedreaders mit jq
Die meisten modernen Websites bieten heute offene API-Endpunkte zum Lesen von Daten innerhalb ihrer Plattformen. Beispielsweise hat jedes Github-Repository seine eigene API-URL, über die Sie die neuesten Commits und Probleme für dieses Projekt abrufen können.
Sie können einen API-Endpunkt wie diesen mit jq verwenden, um Ihren eigenen einfachen „RSS-ähnlichen“ Feed zu erstellen. Verwenden Sie zunächst cURL, um zu testen, ob der Endpunkt ordnungsgemäß funktioniert:
Führen Sie Folgendes aus, um den ersten Eintrag in Ihrem Feed auszudrucken:
Dies zeigt die verschiedenen Felder, die die Github-API an jq sendet. Sie können diese verwenden, um Ihr eigenes benutzerdefiniertes JSON-Objekt zu erstellen, indem Sie die Eingabe an den {}
Filter mit geschweiften Klammern ( ) weiterleiten:
Durch Hinzufügen des Kommafilters (,) innerhalb der geschweiften Klammern können Sie Ihrem benutzerdefinierten Objekt mehrere Felder hinzufügen:
Durch Entfernen der „0“ in den eckigen Klammern wird Ihr JQ-Filter auf den gesamten Feed angewendet:
Sie können auch ein kleines Bash-Skript erstellen, um die neuesten Probleme Ihres bevorzugten Github-Projekts anzuzeigen. Fügen Sie den folgenden Codeblock in eine leere Shell-Skriptdatei ein:
Speichern Sie Ihre Datei und führen Sie dann den folgenden Befehl aus, um sie ausführbar zu machen:
Testen Sie Ihren neuen Feedreader, indem Sie das neueste Problem in Ihrem bevorzugten Github-Repo auflisten:
2. Lesen und Durchsuchen einer JSON-Datenbank
Außer dem Lesen von Daten aus APIs können Sie mit jq auch JSON-Dateien auf Ihrem lokalen Computer verwalten. Beginnen Sie mit der Erstellung einer einfachen JSON-Datenbankdatei mit Ihrem bevorzugten Texteditor:
Fügen Sie den folgenden Datenblock in Ihre Datei ein und speichern Sie sie:
Testen Sie, ob jq Ihre JSON-Datei richtig liest, indem Sie das erste Objekt in Ihrem Datenbank-Array ausgeben:
Führen Sie eine Abfrage Ihrer JSON-Datenbank mit dem Filter „Object Identifier-Index“ durch. In meinem Fall suche ich nach dem Wert des Schlüssels „.name“ in jedem Eintrag meiner Datenbank:
Sie können auch einige der integrierten Funktionen von jq verwenden, um Ihre Abfragen nach bestimmten Eigenschaften zu filtern. Sie können beispielsweise nach allen JSON-Objekten suchen und diese ausdrucken, deren „.name“-Wert mehr als sechs Zeichen hat:
Arbeiten mit JSON-Datenbanken mit jq
Darüber hinaus kann jq JSON-Datenbanken wie eine einfache Tabellenkalkulation bearbeiten. Der folgende Befehl gibt beispielsweise die Gesamtsumme des Schlüssels „.balance“ für jedes Objekt in der Datenbank aus:
Sie können dies sogar noch erweitern, indem Sie Ihrer Abfrage eine bedingte Anweisung hinzufügen. Im Folgenden wird „.balance“ nur hinzugefügt, wenn der „.name“-Wert des zweiten Objekts „Alice“ ist:
Es ist möglich, Variablen vorübergehend aus Ihrer JSON-Datenbank zu entfernen. Dies kann nützlich sein, wenn Sie Ihren Filter testen und sicherstellen möchten, dass er Ihren Datensatz weiterhin verarbeiten kann:
Sie können Ihrer Datenbank auch neue Variablen hinzufügen, indem Sie den Operator „+“ verwenden. Die folgende Zeile fügt beispielsweise dem ersten Objekt in der Datenbank die Variable „active: true“ hinzu:
3. Transformieren von Nicht-JSON-Daten in jq
Ein weiteres brillantes Feature von jq ist, dass es Nicht-JSON-Daten akzeptieren und damit arbeiten kann. Um dies zu erreichen, verwendet das Programm einen alternativen „Slurp-Modus“, in dem es alle durch Leerzeichen und Zeilenumbrüche getrennten Daten in ein JSON-Array konvertiert.
Sie können diese Funktion aktivieren, indem Sie Daten mit einem -s
Flag in jq weiterleiten:
Ein Vorteil der Konvertierung Ihrer Rohdaten in ein Array besteht darin, dass Sie sie über Array-Indexnummern ansprechen können. Der folgende Befehl fügt zwei Werte hinzu, indem er auf ihren konvertierten Array-Speicherort verweist:
Sie können diesen Array-Speicherort weiter nutzen und neuen JSON-Code darum herum konstruieren. Dieser Code konvertiert beispielsweise den Text des Echo-Befehls über den Filter mit geschweiften Klammern in ein JSON-Objekt:
Neben der Aufnahme von Rohdaten kann jq auch Nicht-JSON-Daten als Ausgabe zurückgeben. Dies ist nützlich, wenn Sie jq als Teil eines größeren Shell-Skripts verwenden und nur das Ergebnis seiner Filter benötigen.
Führen Sie dazu jq gefolgt vom -r
Flag aus. Beispielsweise liest der folgende Befehl alle Namen aus meiner Datenbankdatei und gibt sie als reine Textdaten zurück:
Alternative JSON-Parser zu jq
Da der Code für jq Open Source ist, haben verschiedene Entwickler ihre eigenen Versionen des JSON-Parsers erstellt. Jede davon hat ihr eigenes Alleinstellungsmerkmal, das einen Kernteil von jq entweder verbessert oder ändert.
1 Gefällt mir
Jaq ist ein leistungsstarker JSON-Parser, der einen nahezu identischen Funktionsumfang wie jq bietet.
Einer der größten Verkaufsargumente von Jaq ist, dass es die Sprache jq bis zu 30-mal schneller ausführen kann als der ursprüngliche Parser und dabei trotzdem abwärtskompatibel bleibt. Das allein macht es wertvoll, wenn Sie große jq-Filter ausführen und die Leistung Ihres Computers maximieren möchten.
Ein Nachteil von jaq ist jedoch, dass es derzeit nicht in den Debian-, Ubuntu- und Fedora-Repositories verfügbar ist. Die einzige Möglichkeit, es zu erhalten, besteht darin, Homebrew herunterzuladen oder es aus dem Quellcode zu kompilieren.
2. Gehen
Gojq ist ein alternativer JSON-Parser, der vollständig in Go geschrieben ist. Er bietet eine zugängliche und benutzerfreundliche Version von jq, die Sie auf fast jeder Plattform installieren können.
Die Fehlermeldungen des ursprünglichen jq-Programms können unglaublich knapp sein. Daher ist das Debuggen von jq-Skripten für einen neuen jq-Benutzer besonders schwierig. Gojq löst dieses Problem, indem es Ihnen zeigt, wo in Ihrem Skript der Fehler liegt, und Ihnen detaillierte Meldungen zur Art des aufgetretenen Fehlers liefert.
Ein weiteres Verkaufsargument von gojq ist, dass es sowohl JSON- als auch YAML-Dateien lesen und verarbeiten kann. Dies kann besonders hilfreich sein, wenn Sie Docker und Docker Compose verwenden und Ihren Bereitstellungsworkflow automatisieren möchten.
Das größte Problem von Gojq ist, dass einige der Funktionen entfernt wurden, die standardmäßig im ursprünglichen JQ-Parser enthalten sind. Beispielsweise sind Optionen wie --ascii-output
, --seq
, und --sort-keys
bei Gojq nicht vorhanden.
3. fq
Im Gegensatz zu jaq und gojq ist fq ein umfassendes Software-Toolkit, das sowohl Text als auch Binärdaten analysieren kann. Es kann mit einer Vielzahl gängiger Formate wie JSON, YAML, HTML und sogar FLAC arbeiten.
Das größte Feature von fq ist, dass es einen integrierten Hex-Reader für Dateien enthält. Dadurch ist es ganz einfach, die interne Struktur einer Datei zu überprüfen, um festzustellen, wie sie aufgebaut ist und ob etwas mit ihr nicht stimmt. Abgesehen davon verwendet fq beim Umgang mit Text auch die gleiche Syntax wie jq, was es für jeden, der bereits mit jq vertraut ist, leicht zu erlernen macht.
Ein Nachteil dieses ehrgeizigen Ziels ist, dass sich FQ noch in der Entwicklungsphase befindet. Daher können sich einige Funktionen und Verhaltensweisen des Programms noch stark ändern.
Das Erkunden von jq, seiner Funktionsweise und seiner Besonderheiten ist nur der erste Schritt beim Erlernen der Programmierung auf Ihrem Computer. Tauchen Sie tief in die wunderbare Welt des Programmierens ein, indem Sie die Grundlagen der Shell-Programmierung lesen.
Bildnachweis: Ferenc Almasi via Unsplash . Alle Änderungen und Screenshots von Ramces Red.
Schreibe einen Kommentar