[Cialug] JSON Querying

Adam Hill adam at diginc.us
Thu Jun 14 14:16:10 UTC 2018


When I first used the AWS CLI I also used JQ but found out later AWS cli
added jq like support built in (one less server dependency) with JMESPath.
It maybe not quite as powerful as JQ but it can do a lot by it's self.

https://docs.aws.amazon.com/cli/latest/userguide/controlling-output.html

> Combined with the three output formats that will be explained in more
detail in the following sections, the --query option is a powerful tool you
can use to customize the content and style of outputs. For more examples
and the full spec of JMESPath, the underlying JSON-processing library,
visit http://jmespath.org/specification.html.

http://jmespath.org/specification.html
https://stackoverflow.com/questions/39162209/count-the-numer-of-instance-in-an-array-using-jmespath

On Thu, Jun 14, 2018 at 9:09 AM Adam Shannon <adamkshannon at gmail.com> wrote:

> You can select just instnaceId like so:
>
> $ jq .Reservations[].Instances[] /tmp/aws.json | jq 'select(
> .BlockDeviceMappings | length <= 2)' | jq -r .InstanceId
> i-0fcf111d64bc97558
>
> On Thu, Jun 14, 2018 at 9:06 AM, Adam Shannon <adamkshannon at gmail.com>
> wrote:
>
> > Does this work for you?
> >
> > $ jq .Reservations[].Instances[] /tmp/aws.json | jq 'select(
> > .BlockDeviceMappings | length <= 2)'
> > {
> >   "Monitoring": {
> >     "State": "enabled"
> >   },
> >   "PublicDnsName": "ec2-xx-xx-x-xx.name-1.amazonaws.com",
> >   "State": {
> >     "Code": 16,
> >     "Name": "running"
> >   },
> >   "LaunchTime": "2018-06-13T12:00:20.000Z",
> >   "PublicIpAddress": "xx.xx.x.xx",
> >   "PrivateIpAddress": "xx.xx.x.xx",
> >   "VpcId": "vpc-rjf271d9",
> >   "CpuOptions": {
> >     "CoreCount": 2,
> >     "ThreadsPerCore": 2
> >   },
> >   "StateTransitionReason": "",
> >   "InstanceId": "i-0fcf111d64bc97558",
> >   "ImageId": "ami-60812a1d",
> >   "PrivateDnsName": "ip-xx-xx-x-xx.ec2.internal",
> >   "SubnetId": "subnet-xxxxxxxxxx",
> >   "InstanceType": "m4.xlarge",
> >   "SourceDestCheck": true,
> >   "Hypervisor": "xen",
> >   "BlockDeviceMappings": [
> >     {
> >       "DeviceName": "/dev/sda1",
> >       "Ebs": {
> >         "Status": "attached",
> >         "DeleteOnTermination": true,
> >         "VolumeId": "vol-xxxxxxxxxxx",
> >         "AttachTime": "2018-04-09T19:41:10.000Z"
> >       }
> >     }
> >   ],
> >   "Architecture": "x86_64",
> >   "RootDeviceType": "ebs",
> >   "RootDeviceName": "/dev/sda1",
> >   "VirtualizationType": "hvm",
> >   "AmiLaunchIndex": 1
> > }
> >
> >
> >
> > On Thu, Jun 14, 2018 at 8:34 AM, Todd Walton <tdwalton at gmail.com> wrote:
> >
> >> I'm having trouble figuring out this JSON query using jq. Maybe someone
> >> here can help?
> >>
> >> I do a 'aws ec2 describe-instances' and I get back a JSON document
> (pasted
> >> in below, truncated for clarity). So now I want to use jq to return the
> >> InstanceId of any instance with less than 2 BlockDeviceMappings. You'll
> >> notice that the first instance, i-0f7771a48c88ec8fc, has 3 block device
> >> mappings: /dev/sda1, /dev/xvdcp, and /dev/xvdcc, while the second
> >> instance,
> >> i-0fcf111d64bc97558, only has 1, /dev/sda1. I want to pass all that
> >> through
> >> jq such that I return the InstanceId of the second one.
> >>
> >> Any suggestions? I'd take a non-jq suggestion if it were possible.
> >>
> >> References:
> >> https://stedolan.github.io/jq/
> >> https://jqplay.org/
> >>
> >> The doc:
> >>
> >> {
> >>   "Reservations": [
> >>     {
> >>       "Instances": [
> >>         {
> >>           "Monitoring": {
> >>             "State": "enabled"
> >>           },
> >>           "PublicDnsName": "ec2-xx-xx-x-xx.name-1.amazonaws.com",
> >>           "State": {
> >>             "Code": 16,
> >>             "Name": "running"
> >>           },
> >>           "LaunchTime": "2018-06-13T12:00:20.000Z",
> >>           "PublicIpAddress": "xx.xx.x.xx",
> >>           "PrivateIpAddress": "xx.xx.x.xx",
> >>           "VpcId": "vpc-rjf271d9",
> >>           "CpuOptions": {
> >>             "CoreCount": 2,
> >>             "ThreadsPerCore": 2
> >>           },
> >>           "StateTransitionReason": "",
> >>           "InstanceId": "i-0f7771a48c88ec8fc",
> >>           "ImageId": "ami-60812a1d",
> >>           "PrivateDnsName": "ip-xx-xx-x-xx.ec2.internal",
> >>           "SubnetId": "subnet-xxxxxxxxxx",
> >>           "InstanceType": "m4.xlarge",
> >>           "SourceDestCheck": true,
> >>           "Hypervisor": "xen",
> >>           "BlockDeviceMappings": [
> >>             {
> >>               "DeviceName": "/dev/sda1",
> >>               "Ebs": {
> >>                 "Status": "attached",
> >>                 "DeleteOnTermination": true,
> >>                 "VolumeId": "vol-xxxxxxxxxxx",
> >>                 "AttachTime": "2018-04-09T19:41:10.000Z"
> >>               }
> >>             },
> >>             {
> >>               "DeviceName": "/dev/xvdcp",
> >>               "Ebs": {
> >>                 "Status": "attached",
> >>                 "DeleteOnTermination": false,
> >>                 "VolumeId": "vol-xxxxxxxxxxx",
> >>                 "AttachTime": "2018-05-17T12:03:23.000Z"
> >>               }
> >>             },
> >>             {
> >>               "DeviceName": "/dev/xvdcc",
> >>               "Ebs": {
> >>                 "Status": "attached",
> >>                 "DeleteOnTermination": false,
> >>                 "VolumeId": "vol-xxxxxxxxxxx",
> >>                 "AttachTime": "2018-05-18T19:34:56.000Z"
> >>               }
> >>             }
> >>           ],
> >>           "Architecture": "x86_64",
> >>           "RootDeviceType": "ebs",
> >>           "RootDeviceName": "/dev/sda1",
> >>           "VirtualizationType": "hvm",
> >>           "AmiLaunchIndex": 0
> >>         },
> >>         {
> >>           "Monitoring": {
> >>             "State": "enabled"
> >>           },
> >>           "PublicDnsName": "ec2-xx-xx-x-xx.name-1.amazonaws.com",
> >>           "State": {
> >>             "Code": 16,
> >>             "Name": "running"
> >>           },
> >>           "LaunchTime": "2018-06-13T12:00:20.000Z",
> >>           "PublicIpAddress": "xx.xx.x.xx",
> >>           "PrivateIpAddress": "xx.xx.x.xx",
> >>           "VpcId": "vpc-rjf271d9",
> >>           "CpuOptions": {
> >>             "CoreCount": 2,
> >>             "ThreadsPerCore": 2
> >>           },
> >>           "StateTransitionReason": "",
> >>           "InstanceId": "i-0fcf111d64bc97558",
> >>           "ImageId": "ami-60812a1d",
> >>           "PrivateDnsName": "ip-xx-xx-x-xx.ec2.internal",
> >>           "SubnetId": "subnet-xxxxxxxxxx",
> >>           "InstanceType": "m4.xlarge",
> >>           "SourceDestCheck": true,
> >>           "Hypervisor": "xen",
> >>           "BlockDeviceMappings": [
> >>             {
> >>               "DeviceName": "/dev/sda1",
> >>               "Ebs": {
> >>                 "Status": "attached",
> >>                 "DeleteOnTermination": true,
> >>                 "VolumeId": "vol-xxxxxxxxxxx",
> >>                 "AttachTime": "2018-04-09T19:41:10.000Z"
> >>               }
> >>             }
> >>           ],
> >>           "Architecture": "x86_64",
> >>           "RootDeviceType": "ebs",
> >>           "RootDeviceName": "/dev/sda1",
> >>           "VirtualizationType": "hvm",
> >>           "AmiLaunchIndex": 1
> >>         }
> >>       ]
> >>     }
> >>   ]
> >> }
> >>
> >> --
> >> Todd
> >> _______________________________________________
> >> Cialug mailing list
> >> Cialug at cialug.org
> >> http://cialug.org/mailman/listinfo/cialug
> >>
> >
> >
> _______________________________________________
> Cialug mailing list
> Cialug at cialug.org
> http://cialug.org/mailman/listinfo/cialug
>


More information about the Cialug mailing list