Bash: mit jq über Listen-Elemente loopen
Mit Bash code ich diverse Sachen, um mir das Admin Leben zu vereinfachen.
Sobald man JSON Dateien oder JSON als API-Response vor sich hat, ist plattformübergreifend jq das Tool der Wahl für ein schnelles Pretty Print oder seinen starken Filter-Funktionen.
Wenn ich in einer Variable die komplette Liste hineinhole …
# Holen einer JSON-Liste $OUT_TOKENS= $( curl $URL )
Für jeden Eintrag wünsche ich eine Verarbeitung. Mit seq kann ich von 1 .. N loopen. Die Anzahl der Elemente müssen wir uns daher zunächst einmal holen. Am enfachsten, wenn ich eine “id” oder einen anderen Key drin habe.
# IDs / Einträge zählen: iTokenCount=$( jq ".[].id " < "$OUT_TOKENS" | wc -l )
Mit einem jq Filter kann ich mir innerhalb der Schleife das N-te Element aus der Variable $OUT_TOKENS herausziehen, in eine eigene Variable legen und dann anschliessend jene zerlegen.
Snippet:
# einmal drüber loopen for i in $( seq 1 $iTokenCount ) do # get N-th token entry="$( jq ".[$i]" < "$OUT_TOKENS")" # ... done
Nehmen wir mal an, ich möchte aus jedem Listen-Eintrag den Key “name” auslesen. Und vielleicht noch einen 2. oder 3…
Dann schreibt man zunächst eine kleine Funktion
# Get a single value from json # param string json data # param string key # return string function getKey(){ jq -r ".$2" <<< "$1" | grep -v "null" }
… welche man dann innerhalb des Loops verwendet:
for i in $( seq 1 $iTokenCount ) do # get N-th token entry="$( jq ".[$i]" < "$OUT_TOKENS")" sName=$( getKey "$entry" "name" ) if [ -z "$sName" ]; then continue fi sExpire=$( getKey "$entry" "expires_at" ) # ... done
Weiterführende Links
- jq webseite (en)
Kommentar hinzufügen
Die Felder Name und Kommentar sind Pflichtfelder.