Bash: mit jq über Listen-Elemente loopen

Donnerstag, 21. November, 2024

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