aws cli ec2 describe-instances table output

You need to use pipe expression to filter the Tag results and get the first value such as:

aws ec2 describe-instances --instance-ids i-g93g494d i-a93f754c --query "Reservations[*].Instances[*].{name: Tags[?Key=='Name'] | [0].Value, instance_id: InstanceId, ip_address: PrivateIpAddress, state: State.Name}" --output table

There is a nice related blog post here: Get a list of instance with id, name and type


Here's a python program that can be used to generate listings from the descibe-instances command:

import json
import sys

with open( sys.argv[1] ) as f:
  aws = json.load( f ) 
  Reservations = aws['Reservations']
  for Reservation in Reservations:
    Instances = Reservation['Instances']
    for Instance in Instances:
      Tags = Instance['Tags']
      for Tag in Tags:
        if Tag['Key'] == "Name":
          print Tag['Value'],Instance['PrivateIpAddress'],Instance['InstanceId'],Instance['State']['Name']

BTW, I absolutely LOVE Volkan Paksoy's answer. That's going into my bag o' tricks. The above python may have the advantage of allowing you to be more expressive with your search criteria or somehow combining results. In short, it's python, and you don't have to figure out how to use the aws syntax.

Here's how to invoke the python script above:

python parse.py  <( aws ec2 describe-instances  )

Of course, your mileage may vary. For instance, you may not have your region defaulted so, you may need to add an extra parameter as follows:

python parse.py  <( aws ec2 --region us-east-2 describe-instances  )

And you can than manipulate the output a bit to select only running instances and put in a well formatted column list:

python parse.py  <( aws ec2 --region us-east-2 describe-instances  ) | column -t | sort -k1,1 | cat -n  | grep running  

One last note, as I stated, I am a fan of the one liner provided by Volkan. I was just wondering how if the column ordering can be manipulated. I found that aws is sorting the columns alphabetically. To make the ordering obvious, I put numbers in front of the attribute names. However, these attribute names weren't interpreted properly as identifiers, so I had to quote them with double quotes. Here's what I wound up with, please note the subtle quoting changes ( and not so subtle quoting around 'Name' ):

aws ec2 describe-instances  --query 'Reservations[*].Instances[*].{"01-name": Tags[?Key=='"'Name'"'] | [0].Value, "03-instance_id": InstanceId, "02-ip_address": PrivateIpAddress, "04-state" : State.Name}' --output table