2017-04-13 6 views
1

J'écris des scripts bash pour automatiser la gestion des ressources AWS. J'utilise aws-cli et jq, et jusqu'ici les choses ont été formidables. Je marque mes ressources avec des étiquettes personnalisées. Dans certaines circonstances, je voudrais filtrer une liste de ressources basée à la fois sur Key et Value de la balise personnalisée. Mais j'ai du mal à élaborer une requête succincte pour le faire.Tableau de filtres avec jq basé sur des valeurs imbriquées

Ainsi, par exemple, si le (coupé) JSON pour mes instances EC2 est comme:

[ 
    { 
     "PublicIpAddress": "11.22.33.44", 
     "PrivateIpAddress": "55.66.77.88", 
     "Tags": [ 
      { 
       "Value": "live199.blah.com", 
       "Key": "Name" 
      }, 
      { 
       "Value": "live-standalone", 
       "Key": "hc-class" 
      } 
     ] 
    } 
] 
[ 
    { 
     "PublicIpAddress": "111.222.333.444", 
     "PrivateIpAddress": "555.666.777.888", 
     "Tags": [ 
      { 
       "Value": "staging99.blah.com", 
       "Key": "Name" 
      }, 
      { 
       "Value": "staging-standalone", 
       "Key": "hc-class" 
      } 
     ] 
    } 
] 

... et je dois trouver l'entrée où Tags.Key == "hc-class" et Tags.Value = "staging-standalone", comment dois-je faire en une manière succincte avec jq?

Toute aide grandement appréciée.

+1

vous pouvez simplement le faire directement à partir d'aws CLI en utilisant JMESPATH, regardez la question http://stackoverflow.com/questions/43354116/using-jmespath-and-aws-ec2-describe-instances-to-output-multiple- valeurs-tag qui détaille un exemple de la façon de travailler que –

+0

Qu'entendez-vous par "entrée"? Puisque "Tags" est un tableau, le critère d'inclusion n'est pas clair. Cela pourrait aider si vous avez donné la sortie attendue. – peak

+0

Copie possible de [Filtrer la liste d'objets JSON avec jq en faisant correspondre plusieurs objets] (http://stackoverflow.com/questions/33973816/filtering-json-object-list-with-jq-by-matching-multiple-objects) –

Répondre

2

Avec l'entrée donné, le filtre suivant produit la sortie comme indiqué ci-dessous:

.[] | select(any(.Tags[]; .Key == "hc-class" and .Value == "staging-standalone")) 

sortie:

{ 
    "PublicIpAddress": "111.222.333.444", 
    "PrivateIpAddress": "555.666.777.888", 
    "Tags": [ 
    { 
     "Value": "staging99.blah.com", 
     "Key": "Name" 
    }, 
    { 
     "Value": "staging-standalone", 
     "Key": "hc-class" 
    } 
    ] 
} 
+0

fantastique. c'est exactement ce dont j'avais besoin. à votre santé! –

0

Je suis tout à fait nouveau pour JQ, mais je me sens comme je l'ai une solution ici:

https://jqplay.org/s/DljtxNX_72

select((.[0].Tags[1].Key) == "hc-class" and (.[0].Tags[1].Value) == "staging-standalone")