Я пытаюсь получить значение из массива путем сопоставления значения в дочернем массиве, но все, что я пытаюсь, либо ничего не возвращает, либо все члены родительского массива. Я хочу получить информацию только от родителей, у которых совпадает ребенок.
В частности, я хочу перечислить все группы безопасности AWS, в которых есть правила порта 22.
Это сокращенный пример вывода из командной строки aws, который я пытаюсь проанализировать:
{
"SecurityGroups": [
{
"Description": "ssh and web group",
"IpPermissions": [
{
"FromPort": 22,
"ToPort": 22
},
{
"FromPort": 80,
"ToPort": 80
}
],
"GroupName": "ssh-web",
"GroupId": "sg-11111111"
},
{
"Description": "https group",
"IpPermissions": [
{
"FromPort": 443,
"ToPort": 443
},
{
"FromPort": 8443,
"ToPort": 8443
}
],
"GroupName": "https",
"GroupId": "sg-22222222"
}
]
}
Я пробовал это:
aws ec2 describe-security-groups |
jq '.SecurityGroups[] as $top |
.SecurityGroups[].IpPermissions[] |
select(.FromPort == 22) |
$top'
и это:
aws ec2 describe-security-groups |
jq '. as $top |
.SecurityGroups[].IpPermissions[] |
select(.FromPort == 22) |
$top'
Обе команды показывают обе записи массива верхнего уровня вместо одной, содержащей запись порта 22; они просто показывают весь вывод команды aws.
Человек, который ответил на этот вопрос ниже, конкретно ссылается на потенциальную проблему с областью видимости, которая у меня есть на самом деле, но его краткого описания того, как с ней бороться, мне недостаточно, чтобы понять:
jq - Как напечатать родительское значение объекта, когда я уже глубоко в дочерних объектах?
Я хочу увидеть это:
GroupName: "https"
GroupID: "sg-22222222"
Не думаю, что я полностью понимаю, как работает «как», что может быть моим камнем преткновения.