linux-cli-shell cli text-processing json xml jq xmlstarlet advanced

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 grep oder sed zu 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 jq auf jedem Admin-Laptop. Es ist das wichtigste Werkzeug für die Cloud-Ära.
  • Wahl: Nutzen Sie xmlstarlet für die Arbeit mit älteren Enterprise-Applikationen oder Java-Konfigurationen.
  • Automation: Bauen Sie jq Filter in Ihre Bash-Aliase (Artikel 246) ein, um unübersichtliche Tool-Outputs (z.B. von kubectl oder aws 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