So verwenden Sie den jq-Befehl zum Verarbeiten von JSON unter Linux

Jq ist ein leistungsstarkes und äußerst flexibles Parserprogramm, das JSON-Daten aus Dateien und UNIX-Pipes streamen und filtern kann. In diesem Artikel lernen Sie die Grundlagen von jq kennen, stellen Codebeispiele vor und stellen einige alternative Implementierungen vor, die Sie heute installieren können.

Wofür wird jq verwendet?

Die häufigste Verwendung für jq dient der Verarbeitung und Bearbeitung von JSON-Antworten von Software-as-a-Service (SaaS)-APIs. Beispielsweise können Sie jq zusammen mit cURL verwenden, um auf die API-Endpunkte von Digitalocean zuzugreifen und Ihre Kontodaten abzurufen.

Darüber hinaus ist jq auch ein leistungsstarkes Dienstprogramm zur Verwaltung großer JSON-Dateien. Einige der heute beliebtesten Datenbankprogramme wie MongoDB, PostgreSQL und MySQL unterstützen JSON als Möglichkeit zum Speichern von Daten. Daher verschafft Ihnen das Erlernen von jq einen Vorsprung beim Verständnis der Funktionsweise dieser Datenbanksysteme.

Gut zu wissen: Lernen Sie einige der besten Tools zum Bearbeiten von JSON-Dateien in Chrome kennen.

Installieren und Verwenden von jq

Um mit jq zu beginnen, installieren Sie das Binärpaket auf Ihrem System:

Suchen Sie einen offenen API-Endpunkt, auf dem Sie jq testen können. In meinem Fall verwende ich die IP-Checker-API von ipinfo.io.

Der grundlegendste Filter für jq ist der Punktfilter (.). Dadurch wird die JSON-Antwort so gedruckt, wie jq sie von seiner Standardeingabe erhalten hat:

Curl https://ipinfo.io/ |  jq '.'

Ein weiterer grundlegender Filter ist das Pipe-Symbol (|). Dies ist ein spezieller Filter, der die Ausgabe eines Filters als Eingabe eines anderen weiterleitet:

Curl https://ipinfo.io/ |  jq‘.  |  .ip'

Der Wert nach dem Pipe-Operator ist der „Object Identifier-Index“. Dadurch wird Ihre JSON-Eingabe nach einer Variablen durchsucht, die mit ihrem Text übereinstimmt, und ihr Wert wird auf dem Terminal ausgegeben. In diesem Fall suche ich nach dem Wert des Schlüssels „ip:“.

Nachdem die Grundlagen erledigt und entstaubt sind, zeigen Ihnen die folgenden Abschnitte einige der Tricks, die Sie mit jq ausführen können.

Gut zu wissen: Erfahren Sie, wie Sie Textströme mit sed unter Linux bearbeiten können.

1. Erstellen eines einfachen Feed-Readers mit jq

Die meisten modernen Websites bieten heute offene API-Endpunkte zum Lesen von Daten innerhalb ihrer Plattformen. Beispielsweise verfügt jedes Github-Repository über eine eigene API-URL, über die Sie die neuesten Commits und Issues 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. Testen Sie zunächst mit cURL, ob der Endpunkt ordnungsgemäß funktioniert:

Curl https://api.github.com/repos/bitcoin/bitcoin/issues

Führen Sie Folgendes aus, um den ersten Eintrag in Ihrem Feed zu drucken:

Curl https://api.github.com/repos/bitcoin/bitcoin/issues |  jq‘.[0]'

Dadurch werden die verschiedenen Felder angezeigt, 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:

Curl https://api.github.com/repos/bitcoin/bitcoin/issues |  jq‘.[0] |  { Titel: .title }'

Durch Hinzufügen des Komma-Filters (,) innerhalb der geschweiften Klammern können Sie Ihrem benutzerdefinierten Objekt mehrere Felder hinzufügen:

Curl https://api.github.com/repos/bitcoin/bitcoin/issues |  jq‘.[0] |  {Titel: .title, URL: .html_url, Autor: .user.login}'

Wenn Sie die „0“ in den eckigen Klammern entfernen, wird Ihr JQ-Filter auf den gesamten Feed angewendet:

Curl https://api.github.com/repos/bitcoin/bitcoin/issues |  jq‘.[] |  {Titel: .title, URL: .html_url, Autor: .user.login}'

Sie können auch ein kleines Bash-Skript erstellen, um die neuesten Ausgaben Ihres bevorzugten Github-Projekts anzuzeigen. Fügen Sie den folgenden Codeblock in eine leere Shell-Skriptdatei ein:

#!/bin/bash

# Verwendung: ./script.sh [0 ... 29]

REPO="https://api.github.com/repos/bitcoin/bitcoin/issues"

curl $REPO | jq".[$1] | {Titel: .title, URL: .html_url, Autor: .user.login}“

Speichern Sie Ihre Datei und führen Sie dann den folgenden Befehl aus, um sie ausführbar zu machen:

Testen Sie Ihren neuen Feed-Reader, indem Sie die neueste Ausgabe in Ihrem bevorzugten Github-Repo auflisten:

Zu Ihrer Information: Erfahren Sie, wie Sie mit RSS-Bridge unter Linux benutzerdefinierte RSS-Feeds erstellen.

2. Lesen und Durchsuchen einer JSON-Datenbank

Neben dem Auslesen von Daten aus APIs können Sie jq auch zum Verwalten von JSON-Dateien auf Ihrem lokalen Computer verwenden. Erstellen Sie zunächst eine einfache JSON-Datenbankdatei mit Ihrem bevorzugten Texteditor:

Fügen Sie den folgenden Datenblock in Ihre Datei ein und speichern Sie ihn:

[<br>    {"id": 1, "name": "Ramces", "balance": 20},<br>    {"id": 2, "name": "Alice", "balance": 30},<br>    {"id": 3, "name": "Bob", "balance": 10},<br>    {"id": 4, "name": "Charlie", "balance": 20},<br>    {"id": 5, "name": "Maria", "balance": 50}<br>]

Testen Sie, ob jq Ihre JSON-Datei richtig liest, indem Sie das erste Objekt in Ihrem Datenbankarray drucken:

Führen Sie mithilfe des Filters „Object Identifier-Index“ eine Abfrage in Ihrer JSON-Datenbank durch. In meinem Fall suche ich für jeden Eintrag in meiner Datenbank nach dem Wert des Schlüssels „.name“:

jq‘.[] |  .name' Datenbank.json

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 enthält:

jq‘.[] |  select((.name|length)>6)' Datenbank.json

Betrieb auf JSON-Datenbanken mit jq

Darüber hinaus kann jq ähnlich wie eine einfache Tabellenkalkulation mit JSON-Datenbanken arbeiten. Der folgende Befehl gibt beispielsweise die Gesamtsumme des Schlüssels „.balance“ für jedes Objekt in der Datenbank aus:

jq '[.[] |  .balance]|  „Datenbank.json hinzufügen“.

Sie können dies sogar 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:

jq 'wenn .[1].name == „Alice“ dann [ .[] |  .balance ]|  Fügen Sie else „Zweiter Name ist nicht Alice“ und „database.json“ hinzu

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:

jq 'del(.[1].name) |  .[]'Datenbank.json

Sie können auch mit dem „+“-Operator neue Variablen in Ihre Datenbank einfügen. Die folgende Zeile fügt beispielsweise die Variable „active: true“ zum ersten Objekt in der Datenbank hinzu:

jq‘.[0] + {active: true}' Datenbank.json

Notiz: Sie können Ihre Änderungen dauerhaft machen, indem Sie die Ausgabe Ihres jq-Befehls an Ihre ursprüngliche Datenbankdatei weiterleiten: jq '.[0] + {active: true}' Datenbank.json > Datenbank.json.

3. Transformieren von Nicht-JSON-Daten in jq

Ein weiteres brillantes Merkmal von jq ist, dass es Nicht-JSON-Daten akzeptieren und damit arbeiten kann. Um dies zu erreichen, verwendet das Programm einen alternativen „Slurp-Modus“, bei 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 dem Flag -s an jq weiterleiten:

Ein Vorteil der Konvertierung Ihrer Rohdaten in ein Array besteht darin, dass Sie sie mithilfe von Array-Indexnummern adressieren können. Der folgende Befehl fügt zwei Werte hinzu, indem er auf ihren konvertierten Array-Speicherort verweist:

Echo '1 2' |  jq -s '.[0] + .[1]'

Sie können diesen Array-Speicherort erweitern und neuen JSON-Code darum herum erstellen. Dieser Code konvertiert beispielsweise den Text aus dem Echo-Befehl über den Filter für geschweifte Klammern in ein JSON-Objekt:

echo '6 "Mallory" 10' |  jq -s '{"id": .[0]"Name": .[1]"Gleichgewicht": .[2]}'

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 Flag -r aus. Der folgende Befehl liest beispielsweise alle Namen aus meiner Datenbankdatei und gibt sie als Klartextdaten zurück:

jq -r '.[] |  .name' Datenbank.json

Alternative JSON-Parser zu jq

Da der Code für jq Open Source ist, haben verschiedene Entwickler ihre eigenen Versionen des JSON-Parsers erstellt. Jedes davon hat sein eigenes Alleinstellungsmerkmal, das einen Kernteil von jq entweder verbessert oder verändert.

1. jaq

Jaq ist ein leistungsstarker JSON-Parser, der einen nahezu identischen Funktionsumfang wie jq bietet.

Eines der größten Verkaufsargumente von Jaq, das in Rust geschrieben wurde, besteht darin, dass es die JQ-Sprache bis zu 30-mal schneller als der ursprüngliche Parser ausführen kann und gleichzeitig die Abwärtskompatibilität beibehält. Dies allein macht es wertvoll, wenn Sie große JQ-Filter ausführen und die Leistung Ihrer Maschine maximieren möchten.

Allerdings besteht ein Nachteil von jaq darin, dass es derzeit nicht in Debian-, Ubuntu- und Fedora-Repositorys verfügbar ist. Die einzige Möglichkeit, es zu erhalten, besteht darin, entweder Homebrew herunterzuladen oder es aus dem Quellcode zu kompilieren.

2. gojq

Gojq ist ein alternativer JSON-Parser, der vollständig in Go geschrieben ist. Es bietet eine zugängliche und benutzerfreundliche Version von jq, die Sie auf fast jeder Plattform installieren können.

Das ursprüngliche JQ-Programm kann in seinen Fehlermeldungen 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 sich der Fehler in Ihrem Skript befindet, und detaillierte Meldungen über die Art des aufgetretenen Fehlers bereitstellt.

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-Benutzer sind und Ihren Bereitstellungsworkflow automatisieren möchten.

Das größte Problem von Gojq besteht darin, dass einige der Funktionen entfernt wurden, die standardmäßig im ursprünglichen JQ-Parser enthalten sind. Optionen wie --ascii-output, --seq und --sort-keys existieren beispielsweise nicht auf gojq.

Zu Ihrer Information: Erfahren Sie, wie Sie Ihren JSON-Code verbessern können, indem Sie einige der besten JSON-Verschönerer von heute verwenden.

3. fq

Im Gegensatz zu Jaq und Gojq fq ist 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 Merkmal von fq ist, dass es einen integrierten Hex-Reader für Dateien enthält. Dadurch ist es einfach, sich die interne Struktur einer Datei anzusehen, um festzustellen, wie sie erstellt wurde und ob irgendetwas daran falsch ist. Abgesehen davon verwendet fq beim Umgang mit Text auch die gleiche Syntax für jq, was das Erlernen für jeden erleichtert, der bereits mit jq vertraut ist.

Ein Nachteil dieses ehrgeizigen Ziels ist, dass sich fq immer noch in einer starken Entwicklungsphase befindet. Daher unterliegen einige Funktionen und Verhaltensweisen des Programms noch immer weitreichenden Änderungen.

Die Erkundung von JQ, seiner Funktionsweise und seinen Besonderheiten ist nur der erste Schritt, um zu lernen, wie man Programme auf dem Computer erstellt. Tauchen Sie tief in die wunderbare Welt des Programmierens ein, indem Sie die Grundlagen der Shell-Programmierung lesen.

Ferenc Almasi über Unsplash. Alle Änderungen und Screenshots von Ramces Red.

Index
  1. Wofür wird jq verwendet?
  2. Installieren und Verwenden von jq
  3. 1. Erstellen eines einfachen Feed-Readers mit jq
  4. 2. Lesen und Durchsuchen einer JSON-Datenbank
    1. Betrieb auf JSON-Datenbanken mit jq
  5. 3. Transformieren von Nicht-JSON-Daten in jq
  6. Alternative JSON-Parser zu jq
    1. 1. jaq
    2. 2. gojq
    3. 3. fq

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Go up