Comment analyser la sortie JSON sur le shell?
Par exemple, Amazon Web Services fournit une CLI pour récupérer l'état de vos instances:
$ aws ec2 describe-instances <my_instance_id>
Mais la commande renvoie une chaîne JSON. La sortie de cette commande ressemble à ceci:
$ aws ec2 describe-instances x12345
{
"Reservations" :
{
"OwnerId": "1345345"
"Groups": [],
"SecurityGroups": [
{
"Foo" : "yes"
"Bar" : "no
}
]
}
}
Existe-t-il des commandes intégrées pouvant être utilisées pour analyser la sortie JSON?
Par exemple, je voudrais capturer dans une variable shell FOO
, ce qui suit output["Reservations"]["SecurityGroups"][0]{"Foo"}
.
Au cas où cela aiderait, je suis spécifiquement intéressé par les solutions qui pourraient fonctionner avec Zsh.
--output text
si vous souhaitez analyser dans le shell sans utiliser d'outils externes commejshon
.jshon
pour la première fois, j'ai suivi votre lien. Après avoir lu cela, je peux seulement dire que je suis parti très heureux d'avoir, par hasard, entendu parler et installé enjq
premier. Je pense que vous aimerez peut-être aussi en entendre parler si vous ne l'avez pas déjà fait - cela ne dérange pas avec tous ces commutateurs de ligne de commande et peut faire ses propres expressions régulières - cela vous permet même de déclarer des fonctions et des variables si vous le souhaitez. Voir la réponse ici à ce sujet si vous êtes intéressé.Réponses:
Si je comprends bien, vous recherchez la valeur de "Foo". C'est vraiment facile à faire avec l'outil de ligne de commande shell
jq
. C'est quelque chose commesed
en ce qu'il implémente son propre type de langage d'analyse. Compte tenu de votre exemple:jq
peut êtreyes
aussi simple que:PRODUCTION
Vous pouvez parcourir un hachage d'objet ou une liste de dictionnaires à l'aide de la
.dot
notation, et les tableaux indexés peuvent être indexés plus simplement, avec, comme vous l'avez probablement deviné, des index numériques entre crochets. Dans la commande ci-dessus, j'utilise le formulaire d'index vide pour indiquer que je veux que tous les éléments itérables de ce niveau soient développés. Cela peut être plus facile à comprendre de cette façon:... qui décompose toutes les valeurs pour les éléments de deuxième niveau dans le hachage et me donne ...
Cela raye à peine la surface en ce qui concerne
jq
les capacités de. C'est un outil extrêmement puissant pour sérialiser les données dans le shell, il se compile en un seul binaire exécutable dans le style Unix classique, il est très probablement disponible via le gestionnaire de paquets pour votre distribution, et il est très bien documenté. S'il vous plaît visitez songit
-Page et de voir par vous - même.Soit dit en passant, une autre façon d'aborder les données en couches
json
- au moins pour avoir une idée de ce avec quoi vous travaillez - pourrait être d'aller dans l'autre sens et d'utiliser la.dot
notation pour décomposer toutes les valeurs à tous les niveaux, comme:Mais bien mieux, probablement, serait simplement d'utiliser l'une des nombreuses méthodes de découverte ou de recherche
jq
proposées pour les différents types de nœuds.la source
C'est une réponse à votre objectif, mais pas à votre question. Cela signifie que vous pouvez atteindre votre objectif sans utiliser un analyseur JSON.
L'utilitaire AWS cli a la capacité de générer uniquement des champs de sélection à l'aide de l'
--query
argument. Ceci est documenté ici .Par exemple:
Vous pouvez même sélectionner plusieurs champs si vous le souhaitez:
Et vous pouvez également afficher plusieurs structures correspondantes:
la source