jq, объединить два значения из одного и того же подобъекта на разных уровнях на основе «aws description-instance» - PullRequest
0 голосов
/ 28 ноября 2018

Я знаю as утверждение, но не могу понять, как его использовать, я думаю, что я должен сделать что-то вроде:

jq '
    Reservations | .[].Instances as root
    $root.Tags | .[] | select(.Key=="Name") | .Value , 
    $root.BlockDeviceMappings | $root.[].Ebs.VolumeId
' file.json

Цель состоит в том, чтобы перебрать каждый экземпляр и отобразить Tags.Value (выберите .Key=="Name") и .Ebs.VolumeId.

Пример входного файла:

{
    "Reservations": [
        {
            "Instances": [
               {
                     "BlockDeviceMappings": [
                        {
                            "DeviceName": "/dev/xvda",
                            "Ebs": {
                                "DeleteOnTermination": true,
                                "VolumeId": "vol-fffffffffffff"
                             }
                          }
                        ],
                        "Tags": [
                            {
                                "Value": "FOO - DEV - BAR - instance-name",
                                "Key": "Name"
                            }
                    ]
                }
            ],
            "ReservationId": "r-xxxx"
        },
        {
              "Instances": [
                    "another same kind of sub-objects with different values like above repeated"
                ]
        }
    ]
}

Последний подобъект:

"Instances": [
     "another same kind of sub-objects with different values like above repeated"
 ]

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

Ожидаемый результат:

FOO - DEV - BAR - instance-name:vol-fffffffffffff

1 Ответ

0 голосов
/ 28 ноября 2018

Учитывая ваш ввод, следующий вариант вашей jq-программы дает желаемый результат:

(.Reservations[].Instances[]) as $root
| ($root.Tags? | .[] | select(.Key=="Name") | .Value) + ":" 
  + ($root.BlockDeviceMappings? | .[].Ebs.VolumeId) 

На самом деле нет необходимости вводить переменную $root - вы также можете написать:

(.Reservations[].Instances[])
| (.Tags? | .[] | select(.Key=="Name").Value) + ":" 
  + (.BlockDeviceMappings? | .[].Ebs.VolumeId) 

Предостережения

Использование "?"я подозреваю, что выше требуется только потому, что ваш пример JSON придуман.

Кроме того, я не совсем уверен, каковы требования, поэтому приведенное выше может не соответствовать вашим требованиям.После того, как вы освоите синтаксис jq, вы, вероятно, захотите отразить ваши требования более точно.

...