Jq 使用AWS CLI查询嵌套路径并输出为表
我试图在AWSCLI中使用--query命令输出一个表,但由于某些原因,我无法获得同一行中的值。错误是什么 json文件是Jq 使用AWS CLI查询嵌套路径并输出为表,jq,aws-cli,Jq,Aws Cli,我试图在AWSCLI中使用--query命令输出一个表,但由于某些原因,我无法获得同一行中的值。错误是什么 json文件是 { "Reservations": [ { "Groups": [], "Instances": [ { "AmiLaunchIndex": 0, "ImageId": "ami-2a7d75c0", "Instan
{
"Reservations": [
{
"Groups": [],
"Instances": [
{
"AmiLaunchIndex": 0,
"ImageId": "ami-2a7d75c0",
"InstanceId": "i-099569e17a368446b",
"InstanceType": "t2.micro",
"KeyName": "ar_ecs_key",
"LaunchTime": "2018-08-18T17:59:49.000Z",
"Monitoring": {
"State": "disabled"
},
"Placement": {
"AvailabilityZone": "eu-west-1c",
"GroupName": "",
"Tenancy": "default"
},
"PrivateDnsName": "ip-172-31-46-99.eu-west-1.compute.internal",
"PrivateIpAddress": "172.31.46.99",
"ProductCodes": [],
"PublicDnsName": "ec2-34-245-58-217.eu-west-1.compute.amazonaws.com",
"PublicIpAddress": "34.245.58.217",
"State": {
"Code": 16,
"Name": "running"
},
"StateTransitionReason": "",
"SubnetId": "subnet-3407646f",
"VpcId": "vpc-24ddec43",
"Architecture": "x86_64",
"BlockDeviceMappings": [
{
"DeviceName": "/dev/sda1",
"Ebs": {
"AttachTime": "2018-08-18T17:59:49.000Z",
"DeleteOnTermination": true,
"Status": "attached",
"VolumeId": "vol-0d9f4ab048e7999b7"
}
}
],
"ClientToken": "",
"EbsOptimized": false,
"EnaSupport": true,
"Hypervisor": "xen",
"NetworkInterfaces": [
{
"Association": {
"IpOwnerId": "amazon",
"PublicDnsName": "ec2-34-245-58-217.eu-west-1.compute.amazonaws.com",
"PublicIp": "34.245.58.217"
},
"Attachment": {
"AttachTime": "2018-08-18T17:59:49.000Z",
"AttachmentId": "eni-attach-0bbfc61bf0a6729ad",
"DeleteOnTermination": true,
"DeviceIndex": 0,
"Status": "attached"
},
"Description": "",
"Groups": [
{
"GroupName": "default",
"GroupId": "sg-98ce7ee3"
}
],
"Ipv6Addresses": [],
"MacAddress": "0a:df:58:fe:e5:d2",
"NetworkInterfaceId": "eni-02dcc4cbc45726b77",
"OwnerId": "300746241447",
"PrivateDnsName": "ip-172-31-46-99.eu-west-1.compute.internal",
"PrivateIpAddress": "172.31.46.99",
"PrivateIpAddresses": [
{
"Association": {
"IpOwnerId": "amazon",
"PublicDnsName": "ec2-34-245-58-217.eu-west-1.compute.amazonaws.com",
"PublicIp": "34.245.58.217"
},
"Primary": true,
"PrivateDnsName": "ip-172-31-46-99.eu-west-1.compute.internal",
"PrivateIpAddress": "172.31.46.99"
}
],
"SourceDestCheck": true,
"Status": "in-use",
"SubnetId": "subnet-3407646f",
"VpcId": "vpc-24ddec43"
}
],
"RootDeviceName": "/dev/sda1",
"RootDeviceType": "ebs",
"SecurityGroups": [
{
"GroupName": "default",
"GroupId": "sg-98ce7ee3"
}
],
"SourceDestCheck": true,
"Tags": [
{
"Key": "webserver",
"Value": "production"
}
],
"VirtualizationType": "hvm"
}
],
"OwnerId": "300746241447",
"ReservationId": "r-047aab5e090b741af"
}
]
}
我的问题是:
$ aws ec2 describe-instances --instance-ids i-099569e17a368446b --query 'Reservations[*].Instances[].{InstanceId:InstanceId,type:InstanceType,Devicename:BlockDeviceMappings.DeviceName,Persistence_on:BlockDeviceMappings[].Ebs.DeleteOnTermination,Status:BlockDeviceMappings[*].Ebs.Status,Volume_id:BlockDeviceMappings.Ebs.VolumeId}' --output table
结果是:
我确信这与展平操作符[]有关,但我不知道是什么。已尝试所有版本
谢谢你
A嵌套的
块设备应用程序中的所有值都在一个数组中。因此,您需要将其展平到各个值。有几种方法可以使用JMESPath实现这一点,您可以只索引到第一个块设备
Reservations[].Instances[].{
InstanceId: InstanceId,
type: InstanceType,
Devicename: BlockDeviceMappings[0].DeviceName,
Persistence_on: BlockDeviceMappings[0].Ebs.DeleteOnTermination,
Status: BlockDeviceMappings[0].Ebs.Status,
Volume_id: BlockDeviceMappings[0].Ebs.VolumeId
}
但我认为出于可读性考虑,我会选择这种方法(假设aws cli支持merge()
):
另一方面,我发现使用jq
要容易得多。这将产生与json相同的结果
$ aws-cli ... | jq '[.Reservations[].Instances[] |
{ InstanceId, type: .InstanceType } +
(.BlockDeviceMappings[] | {
Devicename: .DeviceName,
Persistence_on: .Ebs.DeleteOnTermination,
Status: .Ebs.Status,
Volume_id: .Ebs.VolumeId
})
]'
嵌套的BlockDeviceMappings
中的所有值都在一个数组中。因此,您需要将其展平到各个值。有几种方法可以使用JMESPath实现这一点,您可以只索引到第一个块设备
Reservations[].Instances[].{
InstanceId: InstanceId,
type: InstanceType,
Devicename: BlockDeviceMappings[0].DeviceName,
Persistence_on: BlockDeviceMappings[0].Ebs.DeleteOnTermination,
Status: BlockDeviceMappings[0].Ebs.Status,
Volume_id: BlockDeviceMappings[0].Ebs.VolumeId
}
但我认为出于可读性考虑,我会选择这种方法(假设aws cli支持merge()
):
另一方面,我发现使用jq
要容易得多。这将产生与json相同的结果
$ aws-cli ... | jq '[.Reservations[].Instances[] |
{ InstanceId, type: .InstanceType } +
(.BlockDeviceMappings[] | {
Devicename: .DeviceName,
Persistence_on: .Ebs.DeleteOnTermination,
Status: .Ebs.Status,
Volume_id: .Ebs.VolumeId
})
]'
您想要使用cli查询或jq的解决方案吗?两者都会有很大的不同。更重要的是,您希望得到什么样的结果?您想要使用cli查询或jq的解决方案吗?两者都会有很大的不同。更重要的是,您希望得到什么样的结果?嗨@Jeff Mercado谢谢,我很想使用jq解决方案,但它不像jmespath那样提供表输出……或者它是否提供了表输出?效果很好:我刚刚做了$aws ec2描述实例--实例ID i-099569e17a368446b--查询“保留”[]。实例[].{InstanceId:InstanceId,类型:InstanceType,Devicename:BlockDeviceMappings[0]。Devicename,Persistence\u on:BlockDeviceMappings[0]。Ebs.DeleteOnTermination,状态:BlockDeviceMappings[0]。Ebs.Status,Volume\u id:BlockDeviceMappings[0]。Ebs.VolumeId}--输出表
您可以输出为csv或tsv,因此,您可以将该输出传递给可以作为表输出的对象。当您想要的功能可以被其他人填充时,您不必限制自己使用单个程序。出于好奇,第二个JMESPath解决方案是否使用merge()
?我没有权限测试它。是否真的有办法在语句的json部分像/那样对shell语句进行换行?没有,合并不起作用。至于jq-你能给我一个简单的例子,如何在终端中用jq作为表输出一些东西吗?merci AHi@Jeff Mercado谢谢,我很想使用jq解决方案,但它不像jmespath那样提供表输出……或者它是否提供了表输出?效果很好:我刚刚做了$aws ec2描述实例--实例ID i-099569e17a368446b--查询'保留[]。实例[]。{InstanceId:InstanceId,type:InstanceType,Devicename:BlockDeviceMappings[0].DeviceName,Persistence\u on:BlockDeviceMappings[0]。Ebs.DeleteOnTermination,状态:BlockDeviceMappings[0]。Ebs.Status,卷\u id:BlockDeviceMappings[0]。Ebs.VolumeId}’--输出表
您可以输出为csv或tsv,因此可以将该输出传递给可以输出为表的对象。当您想要的功能可以被其他人填充时,您不必限制自己使用单个程序。出于好奇,第二个JMESPath解决方案是否使用merge()
?我没有权限测试它。是否真的有办法在语句的json部分像/那样对shell语句进行换行?没有,合并不起作用。至于jq-你能给我一个简单的例子,如何在终端中用jq作为表输出一些东西吗?谢谢