【问题标题】:JQ Select items that do not match stringJQ 选择不匹配字符串的项目
【发布时间】:2017-01-03 21:10:37
【问题描述】:

我有一组通过 aws ec describe-instances 解析的 AWS 实例。我正在寻找删除所有 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 问题 - 我会接受一个通过 --query 开关使用 JMESPath 的答案产生相同的结果。

【问题讨论】:

  • 只需在选择谓词的末尾添加一个not
  • 抱歉,我不太确定语法应该是什么。你能详细说明一下吗?我尝试在几个不同的地方添加“not”,但我不断收到 jq 编译错误。
  • select(.Private | contains("10.10") | not) 您可能也应该使用startswith/1,因为您特别不希望在字符串的开头使用它。
  • D'OH!我从来没有想过 not 应该出现在 contains 之后.... 做到了。谢谢!。如果您想将您的评论表述为答案,我会接受。

标签: amazon-ec2 aws-cli jq


【解决方案1】:

如果 Jeff Marcado 在 cmets 中的答案写成完整的答案,他将被接受。与此同时,由于我在试图让 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}'

【讨论】:

  • 似乎杰夫上面的回答实际上表明“开始于”确实存在。所以就是这样。再次感谢@Jeff Mercado
猜你喜欢
  • 1970-01-01
  • 2021-04-11
  • 2022-10-17
  • 2015-02-21
  • 1970-01-01
  • 1970-01-01
  • 2019-03-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多