jq:选择列表中的.attribute

Bru*_*sky 6 membership arrays json jq

在python中,我可以执行以下操作:

>>> 5 in [2,4,6]
False
>>> 5 in [4,5,6]
True
Run Code Online (Sandbox Code Playgroud)

确定给定值是否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
Run Code Online (Sandbox Code Playgroud)

Bru*_*sky 7

使用 ,

我不知道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
Run Code Online (Sandbox Code Playgroud)

(代码的格式/缩进与 OP 的格式/缩进相匹配以简化视觉比较)

输出是:

"ip-172-31-6-209.us-west-2.compute.internal"
"ip-172-31-6-229.us-west-2.compute.internal"
Run Code Online (Sandbox Code Playgroud)

“在我看来就像巫毒教。”

使用 | IN("a","b","c")

更新:已经16个月了,终于学会了如何使用该IN功能。这是一个演示,将产生与上述相同的结果。

cat > filter.jq <<EOF
# Either of these work in jq < v1.5, but I've commented them out since I'm using v1.6
# def IN(s): first( if (s == .) then true else empty end ) // false;
# def IN(s): first(select(s == .)) // false;

.[] | select(.PrivateIpAddress | IN("172.31.6.209","172.31.6.229")) | .PrivateDnsName
EOF

jq -f filter.jq <<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
Run Code Online (Sandbox Code Playgroud)