JQ检查数组是否包含元素



我已经看过许多其他类似的堆栈溢出问题,但无法找到我正在寻找的确切内容。这看起来很简单,但是我不能把语法弄得很正确,而且我厌倦了往墙上扔意大利面。给定来自AWS CLI的返回:

{
"IPSet":{
"Description":"",
"Name":"testip",
"IPAddressVersion":"IPV4",
"Id":"a1b2c3d4-5678-90ab-cdef-EXAMPLE1111",
"ARN":"arn:aws:wafv2:us-west-2:123456789012:regional/ipset/testip/a1b2c3d4-5678-90ab-cdef-EXAMPLE1111",
"Addresses":[
"192.0.2.0/16"
]
},
"LockToken":"447e55ac-2396-4c6d-b9f9-86b67c17f8b5"
}

如何使用JQ来确定它是否包含某个IP地址?这是到目前为止我最接近的猜测,但不完全正确。

echo ${single_ip_set} | jq -c '.IPSet.Addresses[] | contains("255.255.255.8")'

single_ip_set是变量名。这将检查数组中的每个元素并给出响应。

echo ${single_ip_set} | jq -c '.IPSet.Addresses[] | index("255.255.255.8")'

我真的只想要一个最终的答案,即数组是否包含一个实例。我请求的IP地址

如果要确定序列中的任何值对于谓词是否为真,则这是any()的作业。如果你想做一个精确的字符串比较,==是合适的工具。

jq -c 
--arg tgt "192.0.2.0/16" 
'.IPSet.Addresses | any(. == $tgt)' 
<<<"$single_ip_set"

…为真,而:

jq -c 
--arg tgt "255.255.255.8" 
'.IPSet.Addresses | any(. == $tgt)' 
<<<"$single_ip_set"

…是假的。

最新更新