CLI AI

JSON in der Kommandozeile mit jq filtern

2026-05-25

Hol einen Wert aus JSON mit jq '.users[0].name' api.json — der Punkt ist jqs Pfadsyntax, und alles danach (select, @csv, -r) ist dieselbe Idee, angewendet auf Filtern, Umwandeln oder Aufräumen der Ausgabe. jq behandelt JSON so, wie awk Text behandelt: einmal parsen, dann Filter zusammenpipen. Die sechs Muster unten decken ab, was tatsächlich vorkommt, wenn man vor einer API-Antwort sitzt und ein Feld, eine gefilterte Liste oder ein CSV daraus braucht.

1. Ein Feld holen

clai
$ clai hol den Namen des ersten Users aus api.json→ jq '.users[0].name' api.json"alice"

Der Punkt ist jqs Filter für „den aktuellen Wert nehmen", danach folgt ein Pfad. Die Anführungszeichen in der Ausgabe bedeuten, dass jq einen JSON-String zurückgegeben hat, keinen reinen Text für die Shell.

2. Anführungszeichen fürs Skript entfernen

clai
$ clai gib alle Usernamen ohne Anführungszeichen aus→ jq -r '.users[].name' api.jsonalicebob

-r (raw output) liefert nackte Strings — genau das, was du willst, wenn das Ergebnis in eine Shell-Variable oder eine Schleife geht. Ohne -r bekommst du einen String in Anführungszeichen, der beim ersten Vergleich ohne ersichtlichen Grund scheitert.

3. Nach einer Bedingung filtern

clai
$ clai zeig die Namen der User über 30→ jq -r '.users[] | select(.age > 30) | .name' api.jsonalice

.users[] rollt das Array zu einem Strom von Werten auf, und select() lässt nur die passenden durch. Die Pipe innerhalb von jq funktioniert genau wie eine Shell-Pipe.

4. In CSV umwandeln

clai
$ clai mach daraus csv mit Name und Alter→ jq -r '.users[] | [.name, .age] | @csv' api.json"alice",34"bob",28

Sammle die gewünschten Felder in einem Array und gib es an @csv weiter. Es gibt außerdem @tsv, @base64 und @uri. Das ist eine Zeile statt eines Python-Skripts.

5. Eine unbekannte API-Antwort verstehen

clai
$ clai zeig welche Keys auf der obersten Ebene existieren→ jq -r 'keys[]' api.jsonusers

Das Erste, was sich lohnt, gegen fremdes JSON laufen zu lassen. Danach zeigt jq -r '.users[0] | keys[]' die Felder innerhalb eines Elements.

6. Eine API-Antwort direkt aus curl parsen

clai
$ clai hol json von der api und gib nur das Feld version aus→ curl -s https://example.com/api/status | jq -r '.version'

Diese Kombination ist der ganze Daseinszweck von jq. -s schaltet curls Fortschrittsanzeige aus — sonst landet sie im Stream und jq verschluckt sich daran.

Fallstricke

  • -r ändert die Ausgabe, nicht den Filter. Ein vergessenes -r steckt hinter den meisten "1.2.3"-Merkwürdigkeiten bei String-Vergleichen in bash.
  • Ein Key mit Bindestrich oder Punkt braucht Anführungszeichen: jq '."content-type"'. Ohne sie versucht jq, es als Ausdruck zu parsen, und scheitert.
  • jq verschluckt sich an einem Strom aus mehreren JSON-Objekten. Für zeilenweises JSON (JSON Lines) -s (slurp) hinzufügen oder zeilenweise verarbeiten.

Verwandte Fragen

Wie bekomme ich das letzte Element eines Arrays? jq '.users[-1]'. Negative Indizes zählen vom Ende.

Wie prüfe ich, ob ein Feld existiert? jq 'has("age")' für ein Objekt, oder jq '.users[] | select(has("email"))', um eine Liste zu filtern.

jq oder python -m json.tool? json.tool formatiert nur. jq wählt aus, filtert und transformiert — in einer Pipeline unterschiedliche Aufgaben.

Siehe auch

Beschreibe das Feld, das du brauchst, und CliAI schreibt den jq-Filter, Anführungszeichen inklusive. In einer Zeile installieren.