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[] )
,