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)"'