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 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 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 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 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 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 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-rsteckt 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
- Eine CSV-Spalte mit awk ausgeben (und wann nicht)
- Netzwerk-Triage in einfachen Worten
- Vom One-Liner zum eingecheckten Skript: wann der Wechsel sich lohnt
Beschreibe das Feld, das du brauchst, und CliAI schreibt den jq-Filter, Anführungszeichen inklusive. In einer Zeile installieren.