2014-03-28 42 views
4

我想使用jq(http://stedolan.github.io/jq/)解析aws ec2 describe-instances的json輸出,並僅在標籤包含Name的情況下返回實例ID和標籤。所有者,成本中心。使用jq解析AWS CLI工具的json輸出

這裏是代表源輸出部分節錄JSON:

{ 
    "OwnerId":"121456789127", 
    "ReservationId":"r-48465168", 
    "Groups":[ 

    ], 
    "Instances":[ 
    { 
     "Monitoring":{ 
     "State":"disabled" 
     }, 
     "PublicDnsName":null, 
     "RootDeviceType":"ebs", 
     "State":{ 
     "Code":16, 
     "Name":"running" 
     }, 
     "EbsOptimized":false, 
     "LaunchTime":"2014-03-19T09:16:56.000Z", 
     "PrivateIpAddress":"10.250.171.248", 
     "ProductCodes":[ 
     { 
      "ProductCodeId":"aacglxeowvn5hy8sznltowyqe", 
      "ProductCodeType":"marketplace" 
     } 
     ], 
     "VpcId":"vpc-86bab0e4", 
     "StateTransitionReason":null, 
     "InstanceId":"i-1234576", 
     "ImageId":"ami-b7f6c5de", 
     "PrivateDnsName":"ip-10-120-134-248.ec2.internal", 
     "KeyName":"Test_Virginia", 
     "SecurityGroups":[ 
     { 
      "GroupName":"Test", 
      "GroupId":"sg-12345b" 
     } 
     ], 
     "ClientToken":"VYeFw1395220615808", 
     "SubnetId":"subnet-12345314", 
     "InstanceType":"t1.micro", 
     "NetworkInterfaces":[ 
     { 
      "Status":"in-use", 
      "SourceDestCheck":true, 
      "VpcId":"vpc-123456e4", 
      "Description":"Primary network interface", 
      "NetworkInterfaceId":"eni-3619f31d", 
      "PrivateIpAddresses":[ 
      { 
       "Primary":true, 
       "PrivateIpAddress":"10.120.134.248" 
      } 
      ], 
      "Attachment":{ 
      "Status":"attached", 
      "DeviceIndex":0, 
      "DeleteOnTermination":true, 
      "AttachmentId":"eni-attach-9210dee8", 
      "AttachTime":"2014-03-19T09:16:56.000Z" 
      }, 
      "Groups":[ 
      { 
       "GroupName":"Test", 
       "GroupId":"sg-123456cb" 
      } 
      ], 
      "SubnetId":"subnet-31236514", 
      "OwnerId":"109030037527", 
      "PrivateIpAddress":"10.120.134.248" 
     } 
     ], 
     "SourceDestCheck":true, 
     "Placement":{ 
     "Tenancy":"default", 
     "GroupName":null, 
     "AvailabilityZone":"us-east-1c" 
     }, 
     "Hypervisor":"xen", 
     "BlockDeviceMappings":[ 
     { 
      "DeviceName":"/dev/sda", 
      "Ebs":{ 
      "Status":"attached", 
      "DeleteOnTermination":false, 
      "VolumeId":"vol-37ff097b", 
      "AttachTime":"2014-03-19T09:17:00.000Z" 
      } 
     } 
     ], 
     "Architecture":"x86_64", 
     "KernelId":"aki-88aa75e1", 
     "RootDeviceName":"/dev/sda1", 
     "VirtualizationType":"paravirtual", 
     "Tags":[ 
     { 
      "Value":"Server for testing RDS feature in us-east-1c AZ", 
      "Key":"Description" 
     }, 
     { 
      "Value":"RDS_Machine (us-east-1c)", 
      "Key":"Name" 
     }, 
      { 
      "Value":"1234", 
      "Key":"Cost.centre" 
     }, 
     { 
      "Value":"Jyoti Bhanot", 
      "Key":"Owner" 
     } 
     ], 
     "AmiLaunchIndex":0 
    } 
    ] 
} 

我使用這個命令:

aws ec2 describe-instances | jq '.Instances[] | select(.Tags==["Name","Owner","cost.centre") | .InstanceId, .Tags' 

但它給我的錯誤:

              ^
    error: Invalid character 
.Reservations[].Instances | map(select(has("Tags"))) |.Tags[].Key=="cost.centre")) | map(select(has("InstanceId"))) | .[].InstanceId,.[].Tags 
                       ^
error: Invalid character 
.Reservations[].Instances | map(select(has("Tags"))) |.Tags[].Key=="cost.centre")) | map(select(has("InstanceId"))) | .[].InstanceId,.[].Tags 
                       ^
2 compile errors 

[Errno 32] Broken pipe 

請幫我解決這個錯誤

回答

0

主要問題是您的查詢缺少關閉']',但是我認爲對具有這些標記的EC2實例進行過濾有點麻煩。

這可能是有點令人費解,但這樣的事情對我的作品:

aws ec2 describe-instances | jq '.Instances | map(select(has("Tags"))) | map(select(.Tags[].Key=="Name" and .Tags[].Key=="Owner" and .Tags[].Key=="Cost.centre")) | map(select(has("InstanceId"))) | .[].InstanceId,.[].Tags' 
+0

此命令正在返回沒有輸出 –

+0

對不起,我的aws命令有一個「預訂」頂級元素,而「cost.centre」應該是en Cost.centre「。我更新了命令以匹配您提供的JSON。 – sorohan

+0

你能否爲大小寫敏感嗎? – user3086014

1

試試這個:

$ aws ec2 describe-instances --output json | jq '.Reservations[].Instances[] | (.Tags | from_entries) as $tags | select($tags.Owner != null) | {InstanceID: .InstanceId, Name: $tags.Name, Owner: $tags.Owner, CostCenter: $tags."cost.center"}' 

...返回:

{ 
    "InstanceID": "i-734cbc51", 
    "Name": "someserver001", 
    "Owner": "[email protected]", 
    "CostCenter": "ABC001" 
} 
+0

這對當前aws ec2 describe-instances的輸出有效,但我只注意到它需要調整您的示例輸入;這適用於你的示例:cat sample | jq'.Instances [] | (.Tags | from_entries)作爲$ tags |選擇($ tags.Owner!= null)| {InstanceID:.InstanceId,名稱:$ tags.Name,所有者:$ tags.Owner,CostCenter:$ tags。「Cost.centre」}' – phatypus