如何使用 jq 从多个嵌套数组中提取键
How to extract keys from multiple, nested arrays using jq
设置
我试图弄清楚 jq 过滤器是如何工作的,但在弄清楚嵌套数组时遇到了问题。使用下面的数据,我无法进行平 5 键输出。我可以获得 1 个键和 4 个空值或 4 个键和 1 个空值,但不是所有 5 个键。
1 个键,4 个空值:
.Reservations[] | {OwnerId, InstanceId, ImageId, PrivateIpAddress, Platform}
Returns:
{
"OwnerId": "000000000000",
"InstanceId": null,
"ImageId": null,
"PrivateIpAddress": null,
"Platform": null
}
4 个键,1 个空值:
.Reservations[].Instances[] | {OwnerId, InstanceId, ImageId, PrivateIpAddress, Platform}
{
"OwnerId": null,
"InstanceId": "i-v33333333",
"ImageId": "ami-44444444",
"PrivateIpAddress": "10.0.0.0",
"Platform": "windows"
}
出于各种原因,我无法在 AWS CLI 中使用“--query”选项,该选项return 我正在寻找的格式:
aws ec2 describe-instances --region us-east-1 --profile temp --query 'Reservations[*].{InstanceId:Instances[0].InstanceId,IP:Instances[0].PrivateIpAddress,Platform:Instances[0].Platform,OwnerId:OwnerId}'
输出:
[
{
"InstanceId": "i-11111111",
"IP": "10.9.9.3",
"OwnerId": "111111111111",
"Platform": windows
},
{
"InstanceId": "i-22222222",
"IP": "10.0.0.0",
"OwnerId": "111111111111",
"Platform": windows
}
]
这里是 JSON 输入:
{
"Reservations": [
{
"OwnerId": "000000000000",
"ReservationId": "r-22222222",
"Groups": [],
"RequesterId": "111111111111",
"Instances": [
{
"Monitoring": {
"State": "enabled"
},
"PublicDnsName": null,
"State": {
"Code": 16,
"Name": "running"
},
"EbsOptimized": false,
"LaunchTime": "2015-04-10T00:02:02.000Z",
"Platform": "windows",
"PrivateIpAddress": "10.0.0.0",
"ProductCodes": [
{
"ProductCodeId": "0000000000000000000000000",
"ProductCodeType": "marketplace"
}
],
"VpcId": "vpc-2222222",
"StateTransitionReason": null,
"InstanceId": "i-v33333333",
"ImageId": "ami-44444444",
"PrivateDnsName": "ip-10-0-0-0.aws.foobarcloud.com",
"KeyName": "bar-servicemesh",
"SecurityGroups": [
{
"GroupName": "bar-wildcard-dns-intranet-InstanceSecurityGroup-VN0DFQ13QCDY",
"GroupId": "sg-55555555"
}
],
"ClientToken": "11111111-2222-3333-4444-555555555555_subnet-66666666_1",
"SubnetId": "subnet-66666666",
"InstanceType": "t2.medium",
"NetworkInterfaces": [
{
"Status": "in-use",
"MacAddress": "00:00:00:00:00:77",
"SourceDestCheck": true,
"VpcId": "vpc-66666666",
"Description": null,
"NetworkInterfaceId": "eni-11111111"
}
]
}
]
}
]
}
问题
使用上面的 JSON 输入,如何使用 jq 产生以下输出?:
{
"OwnerId": "000000000000",
"InstanceId": "i-v33333333",
"ImageId": "ami-44444444",
"PrivateIpAddress": "10.0.0.0",
"Platform": "windows"
}
您可以使用变量来存储 OwnerID
,如:
.Reservations[] | .OwnerId as $OwnerId | ( .Instances[] | { "OwnerId": $OwnerId, InstanceId, ImageId, PrivateIpAddress, Platform} )
这很好,但如果您也想获得 ProductCodeId 怎么办?让它看起来像
{
"OwnerId": "000000000000",
"InstanceId": "i-v33333333",
"ImageId": "ami-44444444",
"PrivateIpAddress": "10.0.0.0",
"Platform": "windows",
"ProductCodeId": "0000000000000000000000000"
}
``` ?
设置
我试图弄清楚 jq 过滤器是如何工作的,但在弄清楚嵌套数组时遇到了问题。使用下面的数据,我无法进行平 5 键输出。我可以获得 1 个键和 4 个空值或 4 个键和 1 个空值,但不是所有 5 个键。
1 个键,4 个空值:
.Reservations[] | {OwnerId, InstanceId, ImageId, PrivateIpAddress, Platform}
Returns:
{
"OwnerId": "000000000000",
"InstanceId": null,
"ImageId": null,
"PrivateIpAddress": null,
"Platform": null
}
4 个键,1 个空值:
.Reservations[].Instances[] | {OwnerId, InstanceId, ImageId, PrivateIpAddress, Platform}
{
"OwnerId": null,
"InstanceId": "i-v33333333",
"ImageId": "ami-44444444",
"PrivateIpAddress": "10.0.0.0",
"Platform": "windows"
}
出于各种原因,我无法在 AWS CLI 中使用“--query”选项,该选项return 我正在寻找的格式:
aws ec2 describe-instances --region us-east-1 --profile temp --query 'Reservations[*].{InstanceId:Instances[0].InstanceId,IP:Instances[0].PrivateIpAddress,Platform:Instances[0].Platform,OwnerId:OwnerId}'
输出:
[
{
"InstanceId": "i-11111111",
"IP": "10.9.9.3",
"OwnerId": "111111111111",
"Platform": windows
},
{
"InstanceId": "i-22222222",
"IP": "10.0.0.0",
"OwnerId": "111111111111",
"Platform": windows
}
]
这里是 JSON 输入:
{
"Reservations": [
{
"OwnerId": "000000000000",
"ReservationId": "r-22222222",
"Groups": [],
"RequesterId": "111111111111",
"Instances": [
{
"Monitoring": {
"State": "enabled"
},
"PublicDnsName": null,
"State": {
"Code": 16,
"Name": "running"
},
"EbsOptimized": false,
"LaunchTime": "2015-04-10T00:02:02.000Z",
"Platform": "windows",
"PrivateIpAddress": "10.0.0.0",
"ProductCodes": [
{
"ProductCodeId": "0000000000000000000000000",
"ProductCodeType": "marketplace"
}
],
"VpcId": "vpc-2222222",
"StateTransitionReason": null,
"InstanceId": "i-v33333333",
"ImageId": "ami-44444444",
"PrivateDnsName": "ip-10-0-0-0.aws.foobarcloud.com",
"KeyName": "bar-servicemesh",
"SecurityGroups": [
{
"GroupName": "bar-wildcard-dns-intranet-InstanceSecurityGroup-VN0DFQ13QCDY",
"GroupId": "sg-55555555"
}
],
"ClientToken": "11111111-2222-3333-4444-555555555555_subnet-66666666_1",
"SubnetId": "subnet-66666666",
"InstanceType": "t2.medium",
"NetworkInterfaces": [
{
"Status": "in-use",
"MacAddress": "00:00:00:00:00:77",
"SourceDestCheck": true,
"VpcId": "vpc-66666666",
"Description": null,
"NetworkInterfaceId": "eni-11111111"
}
]
}
]
}
]
}
问题 使用上面的 JSON 输入,如何使用 jq 产生以下输出?:
{
"OwnerId": "000000000000",
"InstanceId": "i-v33333333",
"ImageId": "ami-44444444",
"PrivateIpAddress": "10.0.0.0",
"Platform": "windows"
}
您可以使用变量来存储 OwnerID
,如:
.Reservations[] | .OwnerId as $OwnerId | ( .Instances[] | { "OwnerId": $OwnerId, InstanceId, ImageId, PrivateIpAddress, Platform} )
这很好,但如果您也想获得 ProductCodeId 怎么办?让它看起来像
{
"OwnerId": "000000000000",
"InstanceId": "i-v33333333",
"ImageId": "ami-44444444",
"PrivateIpAddress": "10.0.0.0",
"Platform": "windows",
"ProductCodeId": "0000000000000000000000000"
}
``` ?