2016-04-14 3 views
1

У меня есть (отредактированный) JSON в нижней части этого сообщения, результат запуска экземпляров ec2-describe-экземпляров в AWS. Образец JSON имеет 2 массива, однако это может быть больше. Я использовал jq раньше, но у меня возникли проблемы с выделением значений, которые глубоко вложены в JSON. В частности, меня интересует:jq - извлечение вложенного JSON в несколько массивов

  • INSTANCEID [ "Оговорка": [ "экземпляры": [ "InstanceId":
  • ИмяУстройства [ "Оговорка": [ "Экземпляры": [ "BlockDeviceMappings": [ "Имя_устройство":
  • VolumeId [ "Оговорка": [ "Экземпляры": [ "BlockDeviceMappings": [ "ЭТ": { "VolumeId":
  • ПО1 Значение/Key
  • TAG2 Значение/Key

Подведение итогов ised, я хочу массив JSON, который я могу перебрать, что даст мне экземпляр InstanceID, теги на этом экземпляре и один том том. Вы заметите, что каждый экземпляр имеет 3 тома (может быть больше или меньше). Я хотел бы иметь возможность перебирать каждый из них по отдельности. Конечный результат я надеюсь, будет выглядеть примерно так:

[ 
{ 
"InstanceId": "i-11111111", 
"DeviceName": "/dev/sda1", 
"VolumeId": "vol-1111111a", 
"TAG1": "VALUE1", 
"TAG2": "VALUE2" 
}, 
{ 
"InstanceId": "i-11111111", 
"DeviceName": "xvdf", 
"VolumeId": "vol-1111111b", 
"TAG1": "VALUE1", 
"TAG2": "VALUE2" 
}, 
{ 
"InstanceId": "i-11111111", 
"DeviceName": "xvdg", 
"VolumeId": "vol-1111111c", 
"TAG1": "VALUE1", 
"TAG2": "VALUE2" 
}, 
{ 
"InstanceId": "i-22222222", 
"DeviceName": "/dev/sda1", 
"VolumeId": "vol-2222222a", 
"TAG1": "VALUE1", 
"TAG2": "VALUE2" 
}, 
{ 
"InstanceId": "i-22222222", 
"DeviceName": "/dev/sdb", 
"VolumeId": "vol-2222222b", 
"TAG1": "VALUE1", 
"TAG2": "VALUE2" 
}, 
{ 
"InstanceId": "i-22222222", 
"DeviceName": "/dev/sdc", 
"VolumeId": "vol-2222222c", 
"TAG1": "VALUE1", 
"TAG2": "VALUE2" 
} 
] 

Это похоже на другой вопрос, который я разместил here on stackoverflow. Я пробовал так много разных комбинаций, но не могу заставить это работать. Любая помощь действительно ценится.

Вот JSON:

{ 
    "Reservations": [ 
    { 
     "OwnerId": "xx", 
     "ReservationId": "xx", 
     "Groups": [], 
     "Instances": [ 
     { 
      "Monitoring": { 
      "State": "xx" 
      }, 
      "PublicDnsName": "", 
      "Platform": "xx", 
      "State": { 
      "Code": xx, 
      "Name": "xx" 
      }, 
      "EbsOptimized": xx, 
      "LaunchTime": "xx", 
      "PrivateIpAddress": "xx", 
      "ProductCodes": [], 
      "VpcId": "xx", 
      "StateTransitionReason": "", 
      "InstanceId": "i-11111111", 
      "ImageId": "xx", 
      "PrivateDnsName": "xx", 
      "KeyName": "xx", 
      "SecurityGroups": [ 
      { 
       "GroupName": "xx", 
       "GroupId": "xx" 
      }, 
      { 
       "GroupName": "xx", 
       "GroupId": "xx" 
      } 
      ], 
      "ClientToken": "xx", 
      "SubnetId": "xx", 
      "InstanceType": "xx", 
      "NetworkInterfaces": [ 
      { 
       "Status": "xx", 
       "MacAddress": "xx", 
       "SourceDestCheck": xx, 
       "VpcId": "xx", 
       "Description": "xx", 
       "NetworkInterfaceId": "xx", 
       "PrivateIpAddresses": [ 
       { 
        "PrivateDnsName": "xx", 
        "Primary": xx, 
        "PrivateIpAddress": "xx" 
       } 
       ], 
       "PrivateDnsName": "xx", 
       "Attachment": { 
       "Status": "xx", 
       "DeviceIndex": xx, 
       "DeleteOnTermination": xx, 
       "AttachmentId": "xx", 
       "AttachTime": "xx" 
       }, 
       "Groups": [ 
       { 
        "GroupName": "xx", 
        "GroupId": "xx" 
       }, 
       { 
        "GroupName": "xx", 
        "GroupId": "xx" 
       } 
       ], 
       "SubnetId": "xx", 
       "OwnerId": "xx", 
       "PrivateIpAddress": "xx" 
      } 
      ], 
      "SourceDestCheck": xx, 
      "Placement": { 
      "Tenancy": "xx", 
      "GroupName": "xx", 
      "AvailabilityZone": "xx" 
      }, 
      "Hypervisor": "xx", 
      "BlockDeviceMappings": [ 
      { 
       "DeviceName": "/dev/sda1", 
       "Ebs": { 
       "Status": "attached", 
       "DeleteOnTermination": xx, 
       "VolumeId": "vol-1111111a", 
       "AttachTime": "xx" 
       } 
      }, 
      { 
       "DeviceName": "xvdf", 
       "Ebs": { 
       "Status": "attached", 
       "DeleteOnTermination": xx, 
       "VolumeId": "vol-1111111b", 
       "AttachTime": "xx" 
       } 
      }, 
      { 
       "DeviceName": "xvdg", 
       "Ebs": { 
       "Status": "attached", 
       "DeleteOnTermination": xx, 
       "VolumeId": "vol-11111111c", 
       "AttachTime": "xx" 
       } 
      } 
      ], 
      "Architecture": "xx", 
      "RootDeviceType": "xx", 
      "RootDeviceName": "xx", 
      "VirtualizationType": "hvm", 
      "Tags": [ 
      { 
       "Value": "TAG1", 
       "Key": "VALUE1" 
      }, 
      { 
       "Value": "TAG2", 
       "Key": "VALUE2" 
      }, 
      { 
       "Value": "TAG3", 
       "Key": "VALUE3" 
      }, 
      { 
       "Value": "TAG4", 
       "Key": "VALUE4" 
      }, 
      { 
       "Value": "TAG5", 
       "Key": "VALUE5" 
      }, 
      { 
       "Value": "TAG6", 
       "Key": "Value6" 
      } 
      ], 
      "AmiLaunchIndex": xx 
     } 
     ] 
    }, 
    { 
     "OwnerId": "xx", 
     "ReservationId": "xx", 
     "Groups": [], 
     "Instances": [ 
     { 
      "Monitoring": { 
      "State": "xx" 
      }, 
      "PublicDnsName": "", 
      "Platform": "xx", 
      "State": { 
      "Code": xx, 
      "Name": "xx" 
      }, 
      "EbsOptimized": xx, 
      "LaunchTime": "xx", 
      "PrivateIpAddress": "xx", 
      "ProductCodes": [], 
      "VpcId": "xx", 
      "StateTransitionReason": "", 
      "InstanceId": "i-22222222", 
      "ImageId": "xx", 
      "PrivateDnsName": "xx", 
      "KeyName": "xx", 
      "SecurityGroups": [ 
      { 
       "GroupName": "xx", 
       "GroupId": "xx" 
      }, 
      { 
       "GroupName": "xx", 
       "GroupId": "xx" 
      } 
      ], 
      "ClientToken": "xx", 
      "SubnetId": "xx", 
      "InstanceType": "xx", 
      "NetworkInterfaces": [ 
      { 
       "Status": "xx", 
       "MacAddress": "xx", 
       "SourceDestCheck": xx, 
       "VpcId": "xx", 
       "Description": "xx", 
       "NetworkInterfaceId": "xx", 
       "PrivateIpAddresses": [ 
       { 
        "PrivateDnsName": "xx", 
        "Primary": xx, 
        "PrivateIpAddress": "xx" 
       } 
       ], 
       "PrivateDnsName": "xx", 
       "Attachment": { 
       "Status": "xx", 
       "DeviceIndex": xx, 
       "DeleteOnTermination": xx, 
       "AttachmentId": "xx", 
       "AttachTime": "xx" 
       }, 
       "Groups": [ 
       { 
        "GroupName": "xx", 
        "GroupId": "xx" 
       }, 
       { 
        "GroupName": "xx", 
        "GroupId": "xx" 
       } 
       ], 
       "SubnetId": "xx", 
       "OwnerId": "xx", 
       "PrivateIpAddress": "xx" 
      } 
      ], 
      "SourceDestCheck": xx, 
      "Placement": { 
      "Tenancy": "xx", 
      "GroupName": "xx", 
      "AvailabilityZone": "xx" 
      }, 
      "Hypervisor": "xx", 
      "BlockDeviceMappings": [ 
      { 
       "DeviceName": "/dev/sda1", 
       "Ebs": { 
       "Status": "attached", 
       "DeleteOnTermination": xx, 
       "VolumeId": "vol-2222222a", 
       "AttachTime": "xx" 
       } 
      }, 
      { 
       "DeviceName": "/dev/sdb", 
       "Ebs": { 
       "Status": "attached", 
       "DeleteOnTermination": xx, 
       "VolumeId": "vol-2222222b", 
       "AttachTime": "xx" 
       } 
      }, 
      { 
       "DeviceName": "/dev/sdc", 
       "Ebs": { 
       "Status": "attached", 
       "DeleteOnTermination": xx, 
       "VolumeId": "vol-2222222c", 
       "AttachTime": "xx" 
       } 
      } 
      ], 
      "Architecture": "xx", 
      "RootDeviceType": "xx", 
      "RootDeviceName": "xx", 
      "VirtualizationType": "hvm", 
      "Tags": [ 
      { 
       "Value": "TAG1", 
       "Key": "VALUE1" 
      }, 
      { 
       "Value": "TAG2", 
       "Key": "VALUE2" 
      }, 
      { 
       "Value": "TAG3", 
       "Key": "VALUE3" 
      }, 
      { 
       "Value": "TAG4", 
       "Key": "VALUE4" 
      }, 
      { 
       "Value": "TAG5", 
       "Key": "VALUE5" 
      }, 
      { 
       "Value": "TAG6", 
       "Key": "Value6" 
      } 
      ], 
      "AmiLaunchIndex": xx 
     } 
     ] 
    } 
] 

Edit: пример того, что я пытался (это один не пытаемся получить тег для простоты ради:

jq -r '.Reservations.Instances | map(({ InstanceId } + (.BlockDeviceMappings | add) + (.BlockDeviceMappings.Ebs | Add))| { InstanceId, DeviceName, VolumeId })' <(echo "$json_array_windows") 

jq: error: Add/0 is not defined at <top-level>, line 1: 
.Reservations.Instances | map(({ InstanceId } + (.BlockDeviceMappings | add) + (.BlockDeviceMappings.Ebs | Add))| { InstanceId, DeviceName, VolumeId })          
jq: 1 compile error 

ответ

2

Следующая JQ фильтр производит поток объектов JSON по запросу. Если вам действительно нужен массив JSON, просто оберните все выражение в квадратных скобках.

.Reservations[] | .Instances[] 
| { InstanceId } 
    + (.BlockDeviceMappings[] 
    | { DeviceName, 
     "VolumeId": .Ebs.VolumeId }) 
    + (.Tags 
    | { "TAG1": (map(select(.Value == "TAG1"))[] | .Key), 
     "TAG2": (map(select(.Value == "TAG2"))[] | .Key) }) 

Вот результат (после ввода JSON было исправлено):

{ 
    "InstanceId": "i-11111111", 
    "DeviceName": "/dev/sda1", 
    "VolumeId": "vol-1111111a", 
    "TAG1": "VALUE1", 
    "TAG2": "VALUE2" 
} 
{ 
    "InstanceId": "i-11111111", 
    "DeviceName": "xvdf", 
    "VolumeId": "vol-1111111b", 
    "TAG1": "VALUE1", 
    "TAG2": "VALUE2" 
} 
{ 
    "InstanceId": "i-11111111", 
    "DeviceName": "xvdg", 
    "VolumeId": "vol-11111111c", 
    "TAG1": "VALUE1", 
    "TAG2": "VALUE2" 
} 
{ 
    "InstanceId": "i-22222222", 
    "DeviceName": "/dev/sda1", 
    "VolumeId": "vol-2222222a", 
    "TAG1": "VALUE1", 
    "TAG2": "VALUE2" 
} 
{ 
    "InstanceId": "i-22222222", 
    "DeviceName": "/dev/sdb", 
    "VolumeId": "vol-2222222b", 
    "TAG1": "VALUE1", 
    "TAG2": "VALUE2" 
} 
{ 
    "InstanceId": "i-22222222", 
    "DeviceName": "/dev/sdc", 
    "VolumeId": "vol-2222222c", 
    "TAG1": "VALUE1", 
    "TAG2": "VALUE2" 
} 
+0

Спасибо так много! Однако я заметил, что все DeviceNames являются «/ dev/sda1», которые, по-видимому, ошибочны. – user6127511

+0

Вы сказали: «Я хотел бы иметь возможность перебирать каждую по отдельности». Как я уже сказал, я показал только первые три объекта JSON. – peak

+0

Извинения за неправильное формулирование. Мне нужно, чтобы «DeviceName» правильно отображалось в «VolumeId». Считаете ли вы, что это возможно? – user6127511

Смежные вопросы