jq:选择列表中的.attribute

时间:2018-06-07 21:55:55

标签: arrays json jq membership

在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

2 个答案:

答案 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[] )