Reputation: 13
So I'm using the aws cli to retrieve a list of instances in addition to the jq tool. I do so with the following command.
aws ec2 describe-instances | jq '.Reservations[].Instances[]'
With the following example json response.
{
"Reservations": [
{
"OwnerId": "1234",
"ReservationId": "r-124991k",
"Groups": [],
"Instances": [
{
"Monitoring": {
"State": "disabled"
},
"PublicDnsName": "",
"State": {
"Code": 16,
"Name": "running"
},
"EbsOptimized": false,
"LaunchTime": "2015-07-31T16:48:01.000Z",
"PrivateIpAddress": "11.123.104.123",
"ProductCodes": [],
"VpcId": "vpc-sdfsdf9109",
"StateTransitionReason": "",
"InstanceId": "i-1223421",
"ImageId": "ami-aklasd131",
"PrivateDnsName": "private.dns.name",
"KeyName": "testkey",
"SecurityGroups": [
{
"GroupName": "secur-grou",
"GroupId": "sg-a3d234a"
}
],
"ClientToken": "",
"SubnetId": "subnet-57absfsdf",
"InstanceType": "m3.large",
"NetworkInterfaces": [
{
"Status": "in-use",
"MacAddress": "12:c3:f2:5c:5f:4d",
"SourceDestCheck": false,
"VpcId": "vpc-sdfsdf9109",
"Description": "",
"NetworkInterfaceId": "eni-81b1234",
"PrivateIpAddresses": [
{
"Primary": true,
"PrivateIpAddress": "11.123.104.123"
}
],
"Attachment": {
"Status": "attached",
"DeviceIndex": 0,
"DeleteOnTermination": true,
"AttachmentId": "eni-attach-5asdf234",
"AttachTime": "2015-07-30T16:10:39.000Z"
},
"Groups": [
{
"GroupName": "secur-grou",
"GroupId": "sg-a3d234a"
}
],
"SubnetId": "subnet-57absfsdf",
"OwnerId": "1234",
"PrivateIpAddress": "11.123.104.123"
}
],
"SourceDestCheck": false,
"Placement": {
"Tenancy": "default",
"GroupName": "",
"AvailabilityZone": "us-east-1c"
},
"Hypervisor": "xen",
"BlockDeviceMappings": [
{
"DeviceName": "/dev/sda1",
"Ebs": {
"Status": "attached",
"DeleteOnTermination": true,
"VolumeId": "vol-28c882",
"AttachTime": "2015-07-30T16:10:43.000Z"
}
},
{
"DeviceName": "/dev/sdb",
"Ebs": {
"Status": "attached",
"DeleteOnTermination": true,
"VolumeId": "vol-3f1d5",
"AttachTime": "2015-07-30T16:10:43.000Z"
}
},
{
"DeviceName": "/dev/sdg",
"Ebs": {
"Status": "attached",
"DeleteOnTermination": true,
"VolumeId": "vol-81c8b",
"AttachTime": "2015-07-30T16:10:43.000Z"
}
}
],
"Architecture": "x86_64",
"RootDeviceType": "ebs",
"RootDeviceName": "/dev/sda1",
"VirtualizationType": "hvm",
"Tags": [
{
"Value": "apple",
"Key": "Name"
},
{
"Value": "tag",
"Key": "extra"
}
],
"AmiLaunchIndex": 0
}
]
},
{
"OwnerId": "1234",
"ReservationId": "r-2a72342",
"Groups": [],
"Instances": [
{
"Monitoring": {
"State": "disabled"
},
"PublicDnsName": "",
"State": {
"Code": 16,
"Name": "running"
},
"EbsOptimized": false,
"LaunchTime": "2015-07-31T16:48:01.000Z",
"PrivateIpAddress": "11.123.104.83",
"ProductCodes": [],
"VpcId": "vpc-sdfsdf9109",
"StateTransitionReason": "",
"InstanceId": "i-f9271451",
"ImageId": "ami-aklasd131",
"PrivateDnsName": "private.name.here",
"KeyName": "testkey",
"SecurityGroups": [
{
"GroupName": "secur-grou",
"GroupId": "sg-a3d234a"
}
],
"ClientToken": "",
"SubnetId": "subnet-5llqjwdf",
"InstanceType": "m3.large",
"NetworkInterfaces": [
{
"Status": "in-use",
"MacAddress": "12:ea:06:8b:ff:86",
"SourceDestCheck": false,
"VpcId": "vpc-sdfsdf9109",
"Description": "",
"NetworkInterfaceId": "eni-82kjs91",
"PrivateIpAddresses": [
{
"Primary": true,
"PrivateIpAddress": "11.123.104.13"
}
],
"Attachment": {
"Status": "attached",
"DeviceIndex": 0,
"DeleteOnTermination": true,
"AttachmentId": "eni-attach-35312341",
"AttachTime": "2015-07-30T17:29:00.000Z"
},
"Groups": [
{
"GroupName": "secur-grou",
"GroupId": "sg-a3d234a"
}
],
"SubnetId": "subnet-57absfsdf",
"OwnerId": "1234",
"PrivateIpAddress": "11.123.104.83"
}
],
"SourceDestCheck": false,
"Placement": {
"Tenancy": "default",
"GroupName": "",
"AvailabilityZone": "us-east-1c"
},
"Hypervisor": "xen",
"BlockDeviceMappings": [
{
"DeviceName": "/dev/sda1",
"Ebs": {
"Status": "attached",
"DeleteOnTermination": true,
"VolumeId": "vol-ee1c21",
"AttachTime": "2015-07-30T17:29:02.000Z"
}
},
{
"DeviceName": "/dev/sdb",
"Ebs": {
"Status": "attached",
"DeleteOnTermination": true,
"VolumeId": "vol-13awer",
"AttachTime": "2015-07-30T17:29:02.000Z"
}
},
{
"DeviceName": "/dev/sdg",
"Ebs": {
"Status": "attached",
"DeleteOnTermination": true,
"VolumeId": "vol-3111",
"AttachTime": "2015-07-30T17:29:02.000Z"
}
}
],
"Architecture": "x86_64",
"RootDeviceType": "ebs",
"RootDeviceName": "/dev/sda1",
"VirtualizationType": "hvm",
"Tags": [
{
"Value": "banana",
"Key": "Name"
},
{
"Value": "tag",
"Key": "extra"
}
],
"AmiLaunchIndex": 0
}
]
}
]
}
But for the instances that are returned I would like them to be sorted by their Tag Name. I've tried the following.
jq '.Reservations[]|=sort_by(.Instances[].Tags[.Key="Name"].Value)'
But jq complains with several error messages. Is there an easy way to sort the json by Name tag and then get the PrivateDNS entry in that sorted order?
Upvotes: 1
Views: 1520
Reputation:
Okay, I'm not sure if I understood what you want. This is what I think you are asking for; please correct me if I'm wrong:
In each
Reservation
, I want theInstances
inside to be sorted by theValue
of theTag
whoseKey
is"Name"
And this is what would solve that problem:
jq '.Reservations[].Instances |= sort_by(.Tags[] | select(.Key == "Name").Value)'
Alternatively, you may be asking for this:
I want the
Reservations
to be sorted by theValue
of theTag
whoseKey
is"Name"
inside theInstances
.
Which would be solved by this:
jq '.Reservations |= sort_by(.Instances[].Tags[] | select(.Key == "Name").Value)'
(The behavior of this script is probably meaningless if there are several Instances
in a Reservation
)
As of getting the private DNS values out, just select those with something like:
.Reservations[].Instances[].PrivateDnsName
You can also pipe that after the sorting script.
Upvotes: 2