Um die Schlüssel der obersten Ebene als Stream abzurufen, können Sie die integrierte Funktion verwenden keys[]
. Eine Lösung für Ihr spezielles Problem wäre also:
jq -r 'keys[] as $k | "\($k), \(.[$k] | .ip)"'
keys
erzeugt die Schlüsselnamen in sortierter Reihenfolge; Wenn Sie sie in der ursprünglichen Reihenfolge möchten, verwenden Sie keys_unsorted
.
Eine andere Alternative, die Schlüssel in der ursprünglichen Reihenfolge erzeugt, ist:
jq -r 'to_entries[] | "\(.key), \(.value | .ip)"'
CSV- und TSV-Ausgabe
Die Filter @csv und @tsv könnten hier ebenfalls eine Überlegung wert sein, z
jq -r 'to_entries[] | [.key, .value.ip] | @tsv'
produziert:
host1 10.1.2.3
host2 10.1.2.2
host3 10.1.18.1
Eingebettete Objekte
Wenn die interessierenden Schlüssel wie im folgenden Beispiel eingebettet sind, müsste der jq-Filter gemäß den gezeigten Linien geändert werden.
Eingang:
{
"myhosts": {
"host1": { "ip": "10.1.2.3" },
"host2": { "ip": "10.1.2.2" },
"host3": { "ip": "10.1.18.1" }
}
}
Änderung:
jq -r '.myhosts | keys[] as $k | "\($k), \(.[$k] | .ip)"'
.["id address"]
, wie Sie es ohnehin im Normalfall tun müssten.Kam über sehr elegante Lösung
jq 'with_entries(.value |= .ip)'
Welche Ausgaben
{ "host1": "10.1.2.3", "host2": "10.1.2.2", "host3": "10.1.18.1" }
Hier ist das jqplay-Snippet zum Spielen: https://jqplay.org/s/Jb_fnBveMQ
Die Funktion
with_entries
wandelt jedes Objekt in der Liste der Objekte zu Schlüssel / Wert-Paar, so können wir zugreifen.key
oder.value
jeweils Wir aktualisieren (überschreiben) jedes KV-Element.value
mit dem Feld.ip
von Update mit|=
Operatorquelle