2017-01-03 2 views
0

У меня есть группа экземпляров AWS, которые я обрабатываю через aws ec describe-экземпляры. Я ищу, чтобы обрезать все записи, чьи IP-адреса не начинаются с '10 .10 '.JQ Выберите элементы, которые не соответствуют строке

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"))' 

Это дает мне полную противоположность тому, что я хочу. Кажется логичным, что я должен каким-то образом свести на нет содержание, но я не смог его извлечь из документации или экспериментов. Мое знание jq усложняется, поэтому, возможно, я использую здесь неправильный оператор или функцию.

Хотя мне хотелось бы ответить на этот конкретный вопрос jq - я приму ответ, который использует JMESPath через переключатель -query, дает тот же результат.

+0

Просто добавьте 'not' в конец предиката select. –

+0

Извините, я не совсем уверен, какой синтаксис должен быть. Не могли бы вы уточнить? Я попытался добавить «не» в нескольких разных местах, но я продолжаю получать ошибки компиляции jq. –

+0

'select (.Private | содержит (« 10.10 ») | not)' Вероятно, вы должны использовать ['startswith/1'] (https://stedolan.github.io/jq/manual/#startswith (str)) как так как вы специально не хотите этого в начале строки. –

ответ

0

Ответ Джеффа Маркадо в комментариях будет принят, если он напишет его как полноценный ответ. Тем временем, поскольку я ударил стену, пытаясь заставить JQ сделать это, я экспериментировал с синтаксисом -query для AWS, чтобы получить это.

Это может быть немного лучше, так как это ловит только объекты, начинающиеся с 10.10, тогда как jq сверху поймает любой объект, который содержит 10.10, поэтому такие вещи, как 10.100. или 110.100, и т. д. ... пройдут. Это предполагает, что в jq нет аналогичного оператора «starts_with». Наверное, есть. Несмотря на это, я ставил это здесь, потому что это работало для моей конечной цели и может быть полезно кому-то еще в какой-то момент.

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

Кажется, что ответ Джеффа на самом деле утверждает, что «startswith» DOES существуют. Так и есть. Еще раз спасибо @Jeff Mercado –

Смежные вопросы