JQ: выберите, где. атрибут в списке - PullRequest
0 голосов
/ 08 июня 2018

В 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 голосов
/ 08 июня 2018

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

0 голосов
/ 08 июня 2018

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

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

...