JQ: выберите, где. атрибут в списке

В 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 ответа

Я не знаю, где в 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"

"Похоже на вуду для меня."

Но нет 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[] ),

Другие вопросы по тегам