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é.

24
demandé sur jq170727 2015-12-11 17:58:10

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
44
répondu peak 2017-06-22 13:50:45

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

10
répondu Viacheslav 2018-03-25 11:03:24