在bash脚本中的JSON数组上循环,并通过JQ提取数据



我想通过bash脚本中的jq从jSON文件中提取数据。我在JSON中有50多个SG对象。

这里是一个SG的例子。我想在一行中打印VPC id和组id,以此类推。

我尝试过的解决方案:

jq -c . $old |
while IFS= read -r obj; do 
vpcidold=$( printf '%s' "$obj" | jq '.SecurityGroups[].VpcId')
securityidold=$( printf '%s' "$obj" | jq '.SecurityGroups[].GroupId')
echo "${vpcidold}||${securityidold}"
done > oldtest.json

它是一个工作文件,但一行一行地提供数据,并希望通过for循环进行更多优化。

如何在JSON数组上创建一个循环以获得所需的输出

"SG": [
{
"Description": "des",
"GroupName": "Gpname",
"IpPermissions": [
{
"FromPort": 80,
"IpProtocol": "tcp",
"IpRanges": [
{
"CidrIp": "0.0.0.0/0"
}
],
"Ipv6Ranges": [],
"PrefixListIds": [],
"ToPort": 80,
"UserIdGroupPairs": []
}
],
"OwnerId": "123",
"GroupId": "sg",
"IpPermissionsEgress": [
{
"IpProtocol": "-1",
"IpRanges": [
{
"CidrIp": "0.0.0.0/0"
}
],
"Ipv6Ranges": [],
"PrefixListIds": [],
"UserIdGroupPairs": []
}
],
"Tags": [
{
"Key": "projectcode",
"Value": "none"
},
{
"Key": "sgid",
"Value": "sg-123"
}
],
"VpcId": "vpc-123"
}
]
}, 

如果JSON文件只是一个对象数组,就不需要在bash中对它们进行循环。jq将隐含地在它们上循环:

jq -r '.[][][] | (.VpcId + "||" + .GroupId)' file.json

对以下输入进行测试:

[
{ "SG": [
{
"Description": "des",
"GroupName": "Gpname",
"GroupId": "sg",
"VpcId": "vpc-123"
}
] },
{ "SG": [
{
"Description": "des",
"GroupName": "xyz",
"GroupId": "sg-12345",
"VpcId": "vpc-12345"
}
] }
]

输出:

vpc-123||sg
vpc-12345||sg-12345

最新更新