2017-04-13 7 views
1

Ich schreibe einige Bash-Skripte, um die Verwaltung von AWS-Ressourcen zu automatisieren. Ich verwende aws-cli und jq, und bis jetzt waren die Dinge großartig.Filterarray mit jq basierend auf verschachtelten Werten

Ich markiere meine Ressourcen mit benutzerdefinierten Tags. Unter bestimmten Umständen möchte ich eine Liste von Ressourcen basierend sowohl auf Key als auch Value des benutzerdefinierten Tags filtern. Aber ich habe Schwierigkeiten, eine knappe jq Abfrage zu erarbeiten, um es zu tun.

So zum Beispiel, wenn die (getrimmt) JSON Ausgabe für meine EC2-Instanzen ist wie:

[ 
    { 
     "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" 
      } 
     ] 
    } 
] 

... und ich brauche den Eintrag zu finden, wo Tags.Key == "hc-class" und Tags.Value = "staging-standalone", wie kann ich es tun in eine prägnante Art und Weise mit jq?

Jede Hilfe sehr geschätzt.

+1

Sie können es einfach direkt von aws CLI mit JMESPATH tun, schauen Sie sich die Frage http://StackOverflow.com/Questions/43354116/using-JMespath-and-Aws-Ec2-describe-Instances-to-Output-Multiple- Tag-Werte, die einige Beispiele für die Arbeit mit dem –

+0

Was meinst du mit "Eintrag"? Da "Tags" ein Array ist, ist das Einschlusskriterium unklar. Es könnte hilfreich sein, wenn Sie die erwartete Ausgabe geben. – peak

+0

Mögliches Duplikat von [JSON-Objektliste mit jq filtern, indem mehrere Objekte abgeglichen werden] (http://stackoverflow.com/questions/33973816/filtering-json-object-list-with-jq-bymatching-multiple-objects) –

Antwort

2

Mit dem gegebenen Eingang, die folgenden Filter erzeugen die Ausgabe wie folgt:

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

Ausgang:

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

Fantastisch. das ist genau das, was ich brauchte. Prost! –

0

ich JQ ganz neu bin, aber ich fühle mich wie ich hier eine Lösung habe:

https://jqplay.org/s/DljtxNX_72

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