JSON & XML Processing: jq & xmlstarlet (Artikel 264)
Beherrschung strukturierter Daten auf der Kommandozeile. Erfahren Sie alles über das Filtern von JSON-APIs mit jq und die Manipulation von XML-Dokumenten mit xmlstarlet.
# Data Mastery: JSON und XML sicher verarbeiten
TL;DR / Management Summary In der Ära von Cloud-APIs und Infrastructure as Code sind JSON und XML allgegenwärtig. Ein Senior Admin versucht niemals, diese Formate mit
grepodersedzu bändigen – das führt unweigerlich zu Fehlern bei Zeilenumbrüchen oder Verschachtelungen. Wir nutzen spezialisierte Werkzeuge: jq für JSON und xmlstarlet für XML. Damit extrahieren wir Werte, transformieren ganze Datensätze und validieren die Syntax in Millisekunden.
# 1. Einführung & Architektur
Struktur vor Text.
JSON und XML sind keine Zeilen-basierten Formate. Werkzeuge wie jq bauen intern einen Baum (Tree) des Dokuments auf und erlauben den Zugriff via Pfaden (XPath bei XML, Filters bei JSON).
# Die Werkzeug-Schichten (Mermaid)
graph LR
A[Raw Data: API / Config] --> B{Format Check}
B -->|JSON| C[Tool: jq]
B -->|XML| D[Tool: xmlstarlet]
C --> E[Path Filter: .user.id]
D --> F[XPath Select: //user/@id]
E --> G[Value: 12345]
F --> G
# 2. JSON Processing mit jq
Der Standard für Cloud-Admins.
# Einen Wert extrahieren
# Hole die IP-Adresse aus einer komplexen Docker-Info
docker inspect web01 | jq -r '.[0].NetworkSettings.IPAddress'
-r: Raw output (entfernt die Anführungszeichen).
# Filtern und Mappen
# Zeige Namen aller Container, die aktuell laufen
docker ps --format json | jq '. | select(.State == "running") | .Names'
# 3. XML Processing mit xmlstarlet
Die Macht von XPath.
XML ist geschwätziger und komplexer als JSON. xmlstarlet (Befehl: xml) ist das Werkzeug der Wahl.
# Einen Wert auslesen (Select)
# Hole den Hostnamen aus einer AutoYaST Datei (Artikel 125)
xml sel -t -v "//general/hostname" autoinst.xml
# XML bearbeiten (Edit)
# Ändere einen Wert direkt in der Datei
xml ed -u "//timezone" -v "Europe/Berlin" config.xml
# 4. Day-2 Operations: Validierung
Syntax-Fehler verhindern.
Bevor Sie ein Skript starten, das hunderte VMs erstellt, validieren Sie die Eingabe-Daten.
# JSON validieren
# Gibt einen Fehlercode ungleich 0 zurück, wenn das JSON ungültig ist
cat data.json | jq . > /dev/null
# 5. Troubleshooting & “War Stories”
Wenn die Klammern nicht passen.
# Story 1: “Der unendliche JSON-Array”
Symptom: jq braucht hunderte Megabyte RAM und wird extrem langsam.
Ursache: Die API liefert eine Liste mit Millionen Einträgen. jq lädt standardmäßig das gesamte Dokument in den Speicher.
Lösung: Nutzen Sie den Streaming-Mode von jq (--stream) für extrem große Dateien.
# Story 2: “Namespace-Chaos im XML”
Symptom: xmlstarlet findet keinen einzigen Treffer, obwohl der Pfad //configuration/setting im Editor korrekt aussieht.
Ursache: Das XML nutzt Namespaces (xmlns=...). XPath-Abfragen scheitern dann oft an der Präfix-Erkennung.
Lösung: Nutzen Sie den Wildcard-Operator für Namespaces: //*[local-name()='setting'].
# 6. Fazit & Empfehlung
- Pflicht: Installieren Sie
jqauf jedem Admin-Laptop. Es ist das wichtigste Werkzeug für die Cloud-Ära. - Wahl: Nutzen Sie
xmlstarletfür die Arbeit mit älteren Enterprise-Applikationen oder Java-Konfigurationen. - Automation: Bauen Sie
jqFilter in Ihre Bash-Aliase (Artikel 246) ein, um unübersichtliche Tool-Outputs (z.B. vonkubectloderaws cli) lesbar zu machen.
# Anhang: Cheatsheet
| Aufgabe | jq (JSON) | xmlstarlet (XML) |
|---|---|---|
| Pretty Print | jq . |
xml fo |
| Wert lesen | jq .key.subkey |
xml sel -t -v "//path" |
| Attribut lesen | N/A | xml sel -t -v "//tag/@attr" |
| Liste filtern | `jq '.[] | select(.id==1)'` |
| Feld löschen | jq 'del(.key)' |
xml ed -d "//path" |
| Länge zählen | `jq '. | length’` |
| Raw Output | jq -r |
xml sel -t -v |
| Validierung | jq . < file |
xml val file.xml |