jq: print key et value pour chaque entrée dans un objet
Comment puis-je obtenir jq prendre json comme ceci:
{
"host1": { "ip": "10.1.2.3" },
"host2": { "ip": "10.1.2.2" },
"host3": { "ip": "10.1.18.1" }
}
et générer ce résultat:
host1, 10.1.2.3
host2, 10.1.2.2
host3, 10.1.18.1
le formatage ne m'intéresse pas, Je ne sais pas comment accéder au nom et à la valeur de la clé.
2 réponses
pour obtenir les touches de haut niveau comme un stream, vous pouvez utiliser les touches[]. Donc, une solution à votre problème particulier serait:
jq -r 'keys[] as $k | "\($k), \(.[$k] | .ip)"'
keys
produit les noms de touches dans l'ordre; si vous le souhaitez dans l'ordre d'origine, utilisez keys_unsorted
.
une autre alternative, qui produit des clés dans l'ordre d'origine, est:
jq -r 'to_entries[] | "\(.key), \(.value | .ip)"'
sortie CSV et TSV
les filtres @csv et @tsv pourraient également être à considérer ici, par exemple,
jq -r 'to_entries[] | [.key, .value.ip] | @tsv'
produit:
host1 10.1.2.3
host2 10.1.2.2
host3 10.1.18.1
est tombé sur une solution très élégante
jq 'with_entries(.value |= .ip)'
Qui ouputs
{
"host1": "10.1.2.3",
"host2": "10.1.2.2",
"host3": "10.1.18.1"
}
Voici la jqplay extrait de jouer avec: https://jqplay.org/s/Jb_fnBveMQ
La fonction with_entries
convertit chaque objet dans la liste des objets en paire clé / valeur, ainsi nous pouvons accéder à .key
ou .value
respectivement, nous mettons à jour (par écrasement) tous les KV-élément .value
le champ .ip
en utilisant update |=
opérateur