2017-01-03 7 views
0

Ich habe eine Gruppe von AWS-Instanzen, die ich über aws ec describe-instances analysiere. Ich versuche, alle Datensätze zu entfernen, deren IPs nicht mit '10 .10 'beginnen.JQ Wählen Sie Elemente, die nicht mit der Zeichenfolge übereinstimmen

aws ec2 describe-instances --no-paginate --filter "Name=instance-state-name,Values=running" --query 'Reservations[].Instances[].{Private:PrivateIpAddress,PublicDNS:PublicDnsName,PublicIP:PublicIpAddress}' | jq '.[] | select(.Private | contains("10.10"))' 

Das bringt mir das genaue Gegenteil von dem, was ich will. Es erscheint logisch, dass ich in der Lage sein sollte, die Inhalte irgendwie zu negieren - aber ich konnte es weder aus der Dokumentation noch durch Experimente herausfinden. Mein jq-Können ist mittelmäßig, vielleicht benutze ich hier den falschen Operator oder die falsche Funktion.

Während ich möchte eine Antwort auf diese spezifische JQ Frage - ich werde eine Antwort akzeptieren, die JMESPath durch die - Abfrage-Schalter verwendet, um das gleiche Ergebnis zu erzielen.

+0

Fügen Sie einfach ein 'not' zum Ende des Select-Prädikats hinzu. –

+0

Sorry, ich bin mir nicht sicher, wie die Syntax aussehen sollte. Könnten Sie das näher ausführen? Ich habe versucht, "nicht" an ein paar verschiedenen Orten hinzuzufügen, aber ich bekomme immer jq Kompilierfehler. –

+0

'select (.Private | contains (" 10.10 ") | not)' Wahrscheinlich solltest du ['startswith/1'] (https://stedolan.github.io/jq/manual/#startswith (str)) als verwenden naja da willst du das eigentlich nicht am anfang der string. –

Antwort

0

Jeff Marcados Antwort in den Kommentaren wird akzeptiert, wenn er es als vollständige Antwort schreibt. In der Zwischenzeit, seit ich mit dem Versuch, JQ dazu zu bringen, an die Wand gegangen war, experimentierte ich mit der --Query-Syntax für AWS, um das zu erreichen.

Es könnte ein bisschen besser sein, da dies nur Objekte fängt, die mit 10.10 beginnen, während das jq von oben jedes Objekt fängt, das 10.10 enthält, also Dinge wie 10.100. oder 110.100, etc ... werden durchkommen. Angenommen, es gibt keinen ähnlichen Operator für "starts_with" in jq. Wahrscheinlich ist es da. Unabhängig davon, ich setze das hier, weil es für mein Endziel funktionierte und vielleicht für jemand anderen hilfreich sein kann.

aws ec2 describe-instances \ 
    --no-paginate --filter "Name=instance-state-name,Values=running" \ 
    --query 'Reservations[].Instances[?starts_with(PrivateIpAddress, `10.10.`) == `false`]' | 
    jq '.[] | .[] | {PrivateIpAddress, PublicIpAddress, PublicDnsName}' 
+0

Scheint, dass Jeffs obige Antwort tatsächlich besagt, dass "startswith" existiert. Also da ist das. Danke nochmal @Jeff Mercado –

Verwandte Themen