AWSでec2-describe-instancesを実行した結果、この記事の一番下にJSON(編集済み)があります。サンプルのJSONには2つの配列がありますが、これはもっと大きくなる可能性があります。以前はjqを使用していましたが、JSONに深くネストされた値を引き出すのに問題があります。jq - 複数の配列にネストされたJSONを抽出します
- のInstanceId [ "予約":[ "インスタンス":[ "のInstanceId":
- DeviceNameの[ "予約":[ "インスタンス":[ "BlockDeviceMappings":[特に、私が興味を持っています"DeviceNameの"
- ボリュームID [ "予約": "インスタンス":[ "BlockDeviceMappings":[ "EBS":{ "ボリュームID":
- TAG1値/
- TAG2の値キー/キー
Summar私はインスタンスIDとそのインスタンスにタグを与え、という単一のボリュームを返すことができるJSON配列が必要です。各インスタンスに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
}
]
}
]
編集:
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
はありがとうございました!私はすべてのDeviceNamesがエラーであるように見える '/ dev/sda1'であることに気付きました。 – user6127511
あなたは「私はそれぞれを個別に繰り返すことができます」と言った。私が指摘したように、最初の3つのJSONオブジェクトしか示していませんでした。 – peak
これを正しく言及しないことに対する謝罪。私は 'VolumeId'に正しくマッピングされるために 'DeviceName'が必要です。これが可能だと思いますか? – user6127511