Search code examples
amazon-web-servicesaws-cli

sort ebs volumes using aws cli


I want to get list of all instances of xyz cluster (there will be 20 ec2s) along with volumes info (device name and volume id). Some instances have volumes in one order and some have it in different order. Want to have devices sorted from this output, how do I do that?

aws ec2 describe-instances --filters 'Name=tag:cluster,Values=xyz' --query "Reservations[].Instances[].[InstanceId,BlockDeviceMappings[].[DeviceName,Ebs.VolumeId][]]"  --output text | paste -d" " - -
-- This is how it gets it
i-abc /dev/sdc vol-sdc /dev/sdb vol-sdb /dev/sdd vol-sdad
i-def /dev/sdd vol-sdd /dev/sdb vol-sdb /dev/sdc vol-sdac

-- how I want it
i-abc /dev/sdb vol-sdb /dev/sdc vol-sdc /dev/sdd vol-sdad
i-def /dev/sdb vol-sdb /dev/sdc vol-sdac /dev/sdd vol-sdd

Solution

  • I doubt that you will be able to achieve the desired output with the aws-cli. But you can resort to something like awk:

    $ cat file
    i-abc /dev/sdc vol-sdc /dev/sdb vol-sdb /dev/sdd vol-sdad
    i-def /dev/sdd vol-sdd /dev/sdb vol-sdb /dev/sdc vol-sdac
    
    $ awk '{
      for (i=2;i<=NF;i+=2) {
      PROCINFO["sorted_in"]="@ind_str_asc";
        volumes[$i]=$(i+1)
      }; 
      {
        printf "%s",$1; 
        for (i in volumes) {
          printf(" %s %s", i, volumes[i])
        }; 
        printf "\n"
      }
    }' file
    i-abc /dev/sdb vol-sdb /dev/sdc vol-sdc /dev/sdd vol-sdad
    i-def /dev/sdb vol-sdb /dev/sdc vol-sdac /dev/sdd vol-sdd