2016-04-14 35 views
1

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 

答えて

2

次JQフィルタが生成する:私はこの1つはsimplicities酒のタグを取得しようとしていません(試してみましたが、何かの例要求されたJSONオブジェクトのストリーム JSON配列が本当に必要な場合は、式全体を角かっこで囲みます。

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

は(JSONが修正された入力1回)出力されます:

{ 
    "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

あなたは「私はそれぞれを個別に繰り返すことができます」と言った。私が指摘したように、最初の3つのJSONオブジェクトしか示していませんでした。 – peak

+0

これを正しく言及しないことに対する謝罪。私は 'VolumeId'に正しくマッピングされるために 'DeviceName'が必要です。これが可能だと思いますか? – user6127511

関連する問題