Как я могу поймать VpcId, если я заранее знаю значение связанного тега?

У меня есть следующий вывод aws ec2 describe-vpcs:

{
    "Vpcs": [
        {
            "VpcId": "vpc-1f0e197d",
            "InstanceTenancy": "default",
            "Tags": [
                {
                    "Value": "Product-Production",
                    "Key": "Name"
                }
            ],
            "CidrBlockAssociationSet": [
                {
                    "AssociationId": "vpc-cidr-assoc-f3c5509a",
                    "CidrBlock": "172.19.0.0/16",
                    "CidrBlockState": {
                        "State": "associated"
                    }
                }
            ],
            "State": "available",
            "DhcpOptionsId": "dopt-37fd5550",
            "CidrBlock": "172.19.0.0/16",
            "IsDefault": false
        },
        {
         another vpc...
        }
    ]
}

Я использую jq, чтобы поймать "VpcId", если

.Tags[].Value==Product-Production

но что бы я ни пытался, я не могу получить правильный синтаксис, как этого добиться?


person Itai Ganot    schedule 06.08.2018    source источник
comment
Это так близко к дублированию Как отфильтровать массив объектов на основе значений во внутреннем массиве с помощью jq?, но вам нужно изменить ответ в соответствии с вашими потребностями   -  person Inian    schedule 06.08.2018


Ответы (1)


Вы так близко, но не совсем правильный фильтр. Здесь вам нужно использовать выражение select, чтобы сопоставить объект, соответствующий вашему строковому условию, и отфильтровать из него значение.

jq '.Vpcs[] | select( .Tags[].Value| contains("Product-Production")) | .VpcId'

Если вы сломаете фильтр,

  1. В части .Vpcs[] перечислены все элементы массива, к которым мы применяем условие.
  2. Мы фильтруем тот объект, .Value которого содержит нужную вам здесь строку. Таким образом, в конце вывода первой конвейерной строки вы получаете фактический элемент из списка элементов в массиве, соответствующий определенному условию.
  3. Из возвращенного объекта вы просто распечатываете .VpcId с последним конвейером.

Если вы еще не использовали jqplay.org, вам следует попробовать его и запустить свои фильтры и отрабатывать онлайн.

person Inian    schedule 06.08.2018