JQ选择与字符串不匹配的项目

时间:2017-01-03 21:10:38

标签: amazon-ec2 aws-cli jq

我有一组AWS实例,我正在通过aws ec describe-instances进行解析。我正在寻找修剪所有IP不以'10 .10'开头的记录。

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开关产生相同结果的答案。

1 个答案:

答案 0 :(得分:0)

如果Jeff Marcado将其作为一个完整的答案写出来,那么他将会接受评论中的回答。与此同时,由于我试图让JQ做到这一点,我尝试使用AWS的--query语法来实现这一点。

它可能会好一些,因为它只捕获以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}'