jq итерация и условия - PullRequest
       21

jq итерация и условия

0 голосов
/ 24 января 2019

У меня есть несколько json, которые мне нужно проанализировать с помощью jq.Я пытаюсь извлечь SecurityGroups> GroupId, если какая-либо из SecurityGroups> IpPermissions> IpRanges> CidrIp соответствует определенному IP.

Например, поиск 11.11.11.11 должен вернуть sg-3jf32kj3j.Существует вероятность того, что несколько групп безопасности будут содержать этот IP.Мне нужно вернуть каждый GroupId, который это делает.

Возможно ли это даже с одним jq или потребуется также и bash?

Я нахожу синтаксис jq непонятным по сравнению с тем, чтобы сделать это с чем-токак Python.

{
"SecurityGroups": [{
        "OwnerId": "111111111",
        "Description": "default VPC security group",
        "GroupId": "sg-1a1a1a1a1",
        "VpcId": "vpc-1a1a1a1a1",
        "IpPermissionsEgress": [{
            "IpProtocol": "-1",
            "PrefixListIds": [],
            "Ipv6Ranges": [],
            "UserIdGroupPairs": [],
            "IpRanges": [{
                "CidrIp": "0.0.0.0/0"
            }]
        }],
        "GroupName": "default",
        "IpPermissions": [{
            "IpProtocol": "-1",
            "PrefixListIds": [],
            "Ipv6Ranges": [],
            "UserIdGroupPairs": [{
                "GroupId": "sg-5df45d5d5",
                "UserId": "234234234"
            }],
            "IpRanges": []
        }]
    },
    {
        "OwnerId": "22222222222",
        "Description": "EC2 Security Group",
        "Tags": [{
                "Key": "aws:cloudformation:logical-id",
                "Value": "EC2SecurityGroup"
            },
            {
                "Key": "aws:cloudformation:stack-id",
                "Value": "arn:aws:cloudformation:us-west-2:111111111:stack/blah-prod-vpc/asdfsdf-j3j3-22j1-39fj-sadfsadf"
            },
            {
                "Key": "Name",
                "Value": "blah-production-EC2"
            },
            {
                "Key": "Owner",
                "Value": "blah@blah.com"
            },
            {
                "Key": "aws:cloudformation:stack-name",
                "Value": "prod-vpc"
            },
            {
                "Key": "Created",
                "Value": "2018-05-21T09:40:55-07:00"
            }
        ],
        "GroupId": "sg-3jf32kj3j",
        "VpcId": "vpc-3kj3f2kj3",
        "IpPermissionsEgress": [{
            "IpProtocol": "-1",
            "PrefixListIds": [],
            "Ipv6Ranges": [],
            "UserIdGroupPairs": [],
            "IpRanges": [{
                "CidrIp": "0.0.0.0/0"
            }]
        }],
        "GroupName": "blah-prod-vpc-EC2SecurityGroup-SJHS78F78SSH",
        "IpPermissions": [{
                "IpProtocol": "tcp",
                "ToPort": 80,
                "UserIdGroupPairs": [],
                "IpRanges": [{
                    "CidrIp": "0.0.0.0/0"
                }],
                "FromPort": 80,
                "PrefixListIds": [],
                "Ipv6Ranges": []
            },
            {
                "IpProtocol": "icmp",
                "ToPort": 0,
                "UserIdGroupPairs": [],
                "IpRanges": [{
                    "CidrIp": "11.11.11.11/32"
                }],
                "FromPort": 0,
                "PrefixListIds": [],
                "Ipv6Ranges": []
            },
            {
                "IpProtocol": "-1",
                "PrefixListIds": [],
                "Ipv6Ranges": [],
                "UserIdGroupPairs": [],
                "IpRanges": [{
                        "CidrIp": "22.22.22.22/16"
                    },
                    {
                        "CidrIp": "33.33.33.33/32"
                    }
                ]
            },
            {
                "IpProtocol": "tcp",
                "ToPort": 22,
                "UserIdGroupPairs": [],
                "IpRanges": [{
                    "CidrIp": "0.0.0.0/0"
                }],
                "FromPort": 22,
                "PrefixListIds": [],
                "Ipv6Ranges": [{
                    "CidrIpv6": "::/0"
                }]
            },
            {
                "IpProtocol": "tcp",
                "ToPort": 443,
                "UserIdGroupPairs": [],
                "IpRanges": [{
                    "CidrIp": "0.0.0.0/0"
                }],
                "FromPort": 443,
                "PrefixListIds": [],
                "Ipv6Ranges": []
            },
            {
                "IpProtocol": "icmp",
                "ToPort": -1,
                "UserIdGroupPairs": [],
                "IpRanges": [{
                        "CidrIp": "44.44.44.44/32"
                    },
                    {
                        "CidrIp": "55.55.55.55/29"
                    }
                ],
                "FromPort": -1,
                "PrefixListIds": [],
                "Ipv6Ranges": []
            }
        ]
    }
]}

Ответы [ 2 ]

0 голосов
/ 25 января 2019

Могу ли я предложить вам альтернативное решение вашего вопроса?вот как это выглядит с утилитой unix jtc, которую я недавно разработал:

bash $ cat file.json | jtc -w'<^11.11.11.11\/>R: [-5] [GroupId]' 
"sg-3jf32kj3j"
bash $

также будет отображать все группы, где отображается этот IP-адрес.Если вам это нравится, вы можете найти утилиту на github.com или в Google с jtc и json ключевыми словами

0 голосов
/ 24 января 2019

Следующий фильтр соответствует заявленным требованиям:

.SecurityGroups[]
| select( any(.IpPermissions[].IpRanges[];
              .CidrIp | startswith("11.11.11.11/") ) )
| .GroupId

В частности, с вашим вводом он дает требуемое значение:

"sg-3jf32kj3j"

Возможно, вы захотите рассмотреть более сложный шаблон-сопоставление, возможно, с использованием:

test("^11.11.11.11($|/)")

Если вы хотите, чтобы кавычки были удалены, рассмотрите возможность использования параметра командной строки -r в jq.

Using ..

Вот еще одно решение, но учтите, что оно имеет совершенно другую семантику:

..
| select( .. |  test("^11.11.11.11($|/)")? )
| .GroupId? // empty
...