JSON-Datenverarbeitung mit jq

LinuxLinuxBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Willkommen im Linux jq Programming Lab! In diesem Lab werden Sie entdecken, wie Sie jq, einen leichten und vielseitigen Befehlszeilen-JSON-Prozessor, verwenden können. Stellen Sie sich jq als sed vor, aber speziell für JSON-Daten entwickelt. Es ermöglicht Ihnen, strukturierte Daten mühelos zu zerschneiden, zu filtern, zu mappen und zu transformieren. Dieses Lab ist so strukturiert, dass es Sie von der grundlegenden bis zur fortgeschrittenen Verwendung von jq anhand praktischer Beispiele führt, die Sie in realen Szenarien anwenden können, wie z. B. die Verarbeitung von JSON-Daten aus APIs oder Konfigurationsdateien.

Stellen Sie sich vor, Sie planen eine Reise nach China und verwenden eine Reise-App, die Details zu verschiedenen Sehenswürdigkeiten bietet, einschließlich ihrer Standorte, Öffnungszeiten und Bewertungen. Das Backend der App speichert diese Daten im JSON-Format. Ihre Aufgabe besteht darin, bestimmte Informationen zu extrahieren, um Ihre Reise effektiv zu planen. In diesem Lab wird gezeigt, wie Sie jq verwenden können, um diese JSON-Daten abzufragen und zu manipulieren, sodass Sie schnell die perfekten Sehenswürdigkeiten für Ihren Besuch identifizieren können.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/BasicFileOperationsGroup(["Basic File Operations"]) linux(("Linux")) -.-> linux/InputandOutputRedirectionGroup(["Input and Output Redirection"]) linux/BasicFileOperationsGroup -.-> linux/cat("File Concatenating") linux/InputandOutputRedirectionGroup -.-> linux/pipeline("Data Piping") subgraph Lab Skills linux/cat -.-> lab-279945{{"JSON-Datenverarbeitung mit jq"}} linux/pipeline -.-> lab-279945{{"JSON-Datenverarbeitung mit jq"}} end

Grundlegende JSON-Abfragen

Beginnen wir damit, zu lernen, wie man einfache Daten aus einem JSON-Objekt extrahiert.

Sie sollten jetzt die Datei data.txt in Ihrem Verzeichnis /home/labex/project/ haben. Sie enthält JSON-Daten, die eine Liste von Sehenswürdigkeiten darstellen. Der Dateiinhalt sieht wie folgt aus:

[
  {
    "name": "The Great Wall of China",
    "location": "Shanxi Province",
    "opening_hours": "24 hours"
  },
  {
    "name": "Terracotta Warriors",
    "location": "XiAn",
    "opening_hours": "9:00 AM -  5:00 PM"
  }
]

Unser Ziel hier ist es, die Namen aller in diesen JSON-Daten aufgeführten Sehenswürdigkeiten zu extrahieren.

Um dies zu erreichen, verwenden Sie den folgenden Befehl:

cat ~/project/data.txt | jq '.[] |.name'

Dieser Befehl erzeugt die folgende Ausgabe:

"The Great Wall of China"
"Terracotta Warriors"

Schauen wir uns an, was in diesem Befehl passiert. cat ~/project/data.txt liest einfach den Inhalt der Datei data.txt. Das Symbol |, bekannt als Pipe, nimmt die Ausgabe des cat-Befehls und gibt sie als Eingabe an den jq-Befehl weiter. Der Kern der Extraktionslogik liegt in jq '.[] |.name'. So verarbeitet jq dies:

  • .[] teilt jq mit, durch jedes Element (in diesem Fall jedes Sehenswürdigkeitsobjekt) im JSON-Array zu iterieren.
  • | leitet wiederum das Ergebnis der Iteration an die nächste Operation weiter, in diesem Fall .name.
  • .name extrahiert den Wert, der mit dem Schlüssel "name" in jedem der Sehenswürdigkeitsobjekte verknüpft ist.

Im Wesentlichen geht der Befehl durch jede Sehenswürdigkeit, wählt ihren Namen aus und zeigt ihn an.

Filtern von JSON-Daten

Lassen Sie uns nun zum Filtern von JSON-Daten anhand spezifischer Kriterien übergehen.

Unser Ziel ist es, nur die Sehenswürdigkeiten zu finden, die rund um die Uhr geöffnet sind.

Verwenden Sie den folgenden Befehl, um dies zu erreichen:

cat ~/project/data.txt | jq '.[] | select(.opening_hours == "24 hours") |.name'

Die Ausführung dieses Befehls ergibt die folgende Ausgabe:

"The Great Wall of China"

So funktioniert das Filtern: Der Befehl beginnt mit cat ~/project/data.txt | jq '.[]', was wie zuvor die Datei liest und über jede Sehenswürdigkeit iteriert. Der Schlüsselteil ist die Ergänzung von select(.opening_hours == "24 hours"):

  • select() ist eine jq-Funktion, die es Ihnen ermöglicht, Elemente des JSONs anhand einer von Ihnen angegebenen Bedingung zu filtern.
  • Die Bedingung .opening_hours == "24 hours" prüft, ob der Wert des Felds opening_hours genau gleich der Zeichenkette "24 hours" ist. Nur Sehenswürdigkeiten, die diese Bedingung erfüllen, werden an die nächste Stufe weitergeleitet.
  • Der letzte Teil, |.name, extrahiert einfach den Namen jeder Sehenswürdigkeit, die den Filter bestanden hat.

In diesem Fall erfüllt nur "The Great Wall of China" die Bedingung, daher ist es der einzige Name, der extrahiert und angezeigt wird.

Transformation von JSON-Daten

Nun wollen wir untersuchen, wie man JSON-Daten in ein anderes, nützlicheres Format transformieren kann.

Unser Ziel hier ist es, die Öffnungszeiten lesbarer zu gestalten. Genauer gesagt, wenn eine Sehenswürdigkeit rund um die Uhr geöffnet ist, möchten wir "Open 24 hours" anzeigen; andernfalls fügen wir dem bestehenden Öffnungszeit-Text das Präfix "Open " hinzu.

Verwenden Sie den folgenden Befehl, um dies zu erreichen:

cat ~/project/data.txt | jq '.[] | {name:.name, location:.location, opening_hours: (.opening_hours | if. == "24 hours" then "Open 24 hours" else "Open \(.)) end)}'

Dieser Befehl erzeugt die folgende Ausgabe:

{
  "name": "The Great Wall of China",
  "location": "Shanxi Province",
  "opening_hours": "Open 24 hours"
}
{
  "name": "Terracotta Warriors",
  "location": "XiAn",
  "opening_hours": "Open 9:00 AM -  5:00 PM"
}

Lassen Sie uns die Transformation verstehen: Wie zuvor beginnt cat ~/project/data.txt | jq '.[]', indem es die Datei liest und durch jede Sehenswürdigkeit im Array iteriert. Der Kern dieser Transformation liegt in der Objektkonstruktion und der if-else-Anweisung:

  • {name:.name, location:.location, opening_hours:...} erstellt ein neues JSON-Objekt und zieht Daten aus dem ursprünglichen Objekt. Es enthält direkt den name und die location aus dem ursprünglichen Objekt. Der Wert für das Feld opening_hours ist jedoch komplexer.
  • (.opening_hours | if. == "24 hours" then "Open 24 hours" else "Open \(.)) end) nimmt den Wert der ursprünglichen opening_hours und verarbeitet ihn:
    • .opening_hours wählt den ursprünglichen Öffnungszeitwert aus.
    • Die Anweisung if. == "24 hours" then "Open 24 hours" else "Open \(.)) end prüft, ob die ursprünglichen opening_hours genau gleich "24 hours" sind. Wenn ja, wird der Wert durch "Open 24 hours" ersetzt. Wenn nicht, wird "Open " als Präfix zu den bestehenden opening_hours hinzugefügt. Beachten Sie die Verwendung von \(.)), die es uns ermöglicht, den Wert in der Zeichenkette einzubetten.

Im Wesentlichen transformiert dieser Befehl die Daten, indem er für jede Sehenswürdigkeit ein neues Objekt erstellt und den opening_hours-Wert so anpasst, dass er für den Benutzer lesbarer ist.

Zusammenfassung

Herzlichen Glückwunsch! Sie haben das Linux jq Programming Lab erfolgreich abgeschlossen. Sie haben gelernt, wie Sie JSON-Daten mit jq, einem leistungsstarken Tool zur direkten Arbeit mit strukturierten Daten von der Befehlszeile aus, abfragen, filtern und transformieren können. Egal, ob Sie Daten aus APIs, Konfigurationsdateien oder anderen JSON-Quellen verarbeiten, jq ermöglicht es Ihnen, die benötigten Daten effizient und klar zu extrahieren, zu filtern und zu manipulieren.

Denken Sie daran, dass regelmäßliche Übung für das Beherrschen von jq und anderen Befehlszeilentools unerlässlich ist. Experimentieren Sie gerne mit Ihren eigenen JSON-Daten und versuchen Sie verschiedene Abfragen und Transformationen. Viel Spaß beim Programmieren!