在python中,我可以这样做:
>>> 5 in [2,4,6]
False
>>> 5 in [4,5,6]
True
确定列表中是否存在给定值5
。我想在jq
中做同样的概念。但是,没有in
。这是一个更真实的数据集示例,以及如何检查2个值。根据我的实际需要,我必须检查几百个,并且不希望将所有or
编辑在一起。
jq '.[] | select(.PrivateIpAddress == "172.31.6.209"
or
.PrivateIpAddress == "172.31.6.229")
| .PrivateDnsName' <<EOF
[
{
"PrivateDnsName": "ip-172-31-6-209.us-west-2.compute.internal",
"PrivateIpAddress": "172.31.6.209"
},
{
"PrivateDnsName": "ip-172-31-6-219.us-west-2.compute.internal",
"PrivateIpAddress": "172.31.6.219"
},
{
"PrivateDnsName": "ip-172-31-6-229.us-west-2.compute.internal",
"PrivateIpAddress": "172.31.6.229"
},
{
"PrivateDnsName": "ip-172-31-6-239.us-west-2.compute.internal",
"PrivateIpAddress": "172.31.6.239"
}
]
EOF
答案 0 :(得分:2)
我不知道https://stedolan.github.io/jq/manual/v1.5/在哪里记录了这些内容。但答案是jq
隐含一对多和多对一的纠正。
jq '.[] | select(.PrivateIpAddress == ("172.31.6.209", "172.31.6.229")) | .PrivateDnsName' <<EOF
[
{
"PrivateDnsName": "ip-172-31-6-209.us-west-2.compute.internal",
"PrivateIpAddress": "172.31.6.209"
},
{
"PrivateDnsName": "ip-172-31-6-219.us-west-2.compute.internal",
"PrivateIpAddress": "172.31.6.219"
},
{
"PrivateDnsName": "ip-172-31-6-229.us-west-2.compute.internal",
"PrivateIpAddress": "172.31.6.229"
},
{
"PrivateDnsName": "ip-172-31-6-239.us-west-2.compute.internal",
"PrivateIpAddress": "172.31.6.239"
}
]
EOF
输出结果为:
"ip-172-31-6-209.us-west-2.compute.internal"
"ip-172-31-6-229.us-west-2.compute.internal"
&#34;对我来说似乎是伏都教。&#34;
答案 1 :(得分:2)
但是,没有
in
。
您可以使用index/1
,如手册中所述。更好的方法是使用IN
,但这只是在jq 1.5发布后引入的。如果您的jq没有它,您可以将此定义用于IN/1
:
# return true or false as . is in the stream s
def IN(s):
first( if (s == .) then true else empty end ) // false;
如果您想检查数组中的成员资格,例如$ a,只需使用IN( $a[] )
。