jq

Kommandozeilen-JSON-Prozessor - JSON-Daten in Shell-Skripten und Pipelines parsen, filtern, transformieren

TL;DR

Was: Leichtgewichtiger Kommandozeilen-JSON-Prozessor.

Warum: JSON parsen, filtern, transformieren, skriptfähig, pipe-freundlich.

Quick Start

Installation:

# macOS
brew install jq

# Ubuntu/Debian
sudo apt install jq

# Version prüfen
jq --version

Grundlegende Verwendung:

# Formatierte Ausgabe
echo '{"name":"John"}' | jq '.'

# Feld abrufen
echo '{"name":"John"}' | jq '.name'

# Aus Datei
jq '.' data.json

Cheatsheet

FilterBeschreibung
.Identität (gesamte Eingabe)
.fieldFeld abrufen
.[]Array iterieren
.[0]Array-Index
``
select()Elemente filtern
map()Elemente transformieren

Gotchas

Basic selection

# Beispiel-JSON
echo '{"user":{"name":"John","age":30}}' | jq '.'

# Verschachteltes Feld abrufen
echo '{"user":{"name":"John"}}' | jq '.user.name'
# Ausgabe: "John"

# Rohstring abrufen (ohne Anführungszeichen)
echo '{"name":"John"}' | jq -r '.name'
# Ausgabe: John

# Mehrere Felder
echo '{"name":"John","age":30}' | jq '.name, .age'

Arrays

# Beispiel-Array
echo '[1,2,3,4,5]' | jq '.'

# Alle Elemente abrufen
echo '[1,2,3]' | jq '.[]'

# Nach Index abrufen
echo '["a","b","c"]' | jq '.[1]'
# Ausgabe: "b"

# Ausschnitt
echo '[1,2,3,4,5]' | jq '.[2:4]'
# Ausgabe: [3,4]

# Array-Länge
echo '[1,2,3]' | jq 'length'

Objects in arrays

# Beispieldaten
DATA='[{"name":"John","age":30},{"name":"Jane","age":25}]'

# Alle Namen abrufen
echo $DATA | jq '.[].name'

# Erstes Element abrufen
echo $DATA | jq '.[0]'

# Zu neuer Struktur mappen
echo $DATA | jq 'map({n: .name, a: .age})'

Filtering

# Elemente auswählen
echo '[1,2,3,4,5]' | jq 'map(select(. > 2))'
# Ausgabe: [3,4,5]

# Objekte filtern
DATA='[{"name":"John","age":30},{"name":"Jane","age":25}]'
echo $DATA | jq '.[] | select(.age > 26)'

# Mehrere Bedingungen
echo $DATA | jq '.[] | select(.age > 20 and .name == "John")'

Transformation

# Werte mappen
echo '[1,2,3]' | jq 'map(. * 2)'
# Ausgabe: [2,4,6]

# Feld hinzufügen
echo '{"name":"John"}' | jq '. + {age: 30}'

# Feld aktualisieren
echo '{"count":1}' | jq '.count += 1'

# Feld löschen
echo '{"name":"John","age":30}' | jq 'del(.age)'

# Neues Objekt konstruieren
echo '{"first":"John","last":"Doe"}' | jq '{fullName: "\(.first) \(.last)"}'

Practical examples

# API-Antwort parsen
curl -s https://api.github.com/users/octocat | jq '{name, company, location}'

# Elemente zählen
cat data.json | jq 'length'

# Werte summieren
echo '[{"price":10},{"price":20}]' | jq '[.[].price] | add'

# Nach Feld gruppieren
echo '[{"type":"a"},{"type":"b"},{"type":"a"}]' | jq 'group_by(.type)'

# Sortieren
echo '[3,1,2]' | jq 'sort'
echo '[{"name":"B"},{"name":"A"}]' | jq 'sort_by(.name)'

Next Steps