#arrays #json #bash #jq
#массивы #json #bash #jq
Вопрос:
я хочу извлекать данные из файла jSON через jq в скрипте bash. У меня более 50 объектов SG в JSON.
вот пример одного SG . Я хочу напечатать идентификатор VPC и идентификатор группы в одной строке и так далее для других объектов.
Решение, которое я пробовал :
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"
}
]
},
Комментарии:
1. Я в замешательстве: что такое ввод, что такое вывод?
2. Я хочу извлечь значение VPCid и групповой IP из файла json.
3. @choroba- если вы видите в моем файле JSON, вы можете увидеть, что там есть groupId и задан идентификатор группы, я хочу распечатать эти значения. Это только один объект, который вы можете видеть, похожий на то, что у меня есть 50 с лишним объектов, поэтому, я полагаю, мы должны использовать его для цикла
4. Можете ли вы включить хотя бы два экземпляра в образец? Что-то вроде
jq '.SG[] | (.VpcId "||" .GroupId)'
может работать в зависимости от того, как организованы объекты.5. Я обновил файл json с 2 объектами SGS.
Ответ №1:
Если файл 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
Комментарии:
1. Рассмотрите возможность фильтрации любого потомка с помощью groupId:
jq -r '..|select(.GroupId?)|(.VpcId "||" .GroupId)'