aws ec2 描述安全组 + awk sed

aws ec2 描述安全组 + awk sed

我确信这不是最有效的方法,但我需要帮助格式化此 aws 命令的结果:

aws ec2 describe-security-groups --group-ids sg-xxxxxxxxxxxxx --region=us-east-1 --profile=default | sed -n '/\"FromPort\"\: 22\,/,/\"ToPort\": 22\,/p'

结果显示特定于端口 22 的数据。结果示例如下:

                        {
                            "CidrIp": "1.2.3.4/32"
                        },
                        {
                            "CidrIp": "5.6.7.8/32"
                        },
                        {
                            "Description": "test1",
                            "CidrIp": "4.3.2.1/32"
                        },
                        {
                            "Description": "test2",
                            "CidrIp": "8.7.6.5/32"
                        },

正如我们所看到的,某些条目可能包含描述,而其他条目则可能不包含。

我想将结果格式化为这样:

1.2.3.4/32
5.6.7.8/32
4.3.2.1/32 <tab> test1
8.7.6.5/32 <tab> test2

我尝试将 --filters 添加到 aws 命令中,但我不清楚如何最好地获得所需的输出。非常感谢您的帮助!

答案1

由于您使用的是 AWS CLI,因此我建议使用--query和/或--filter标志来获取必要的格式和输出。

AWS CLI 提供服务器端和客户端过滤

--filter标志提供服务器端过滤,如果数据集很大,也可能有助于缩短 HTTP 响应时间,但是该--query标志提供更强大的客户端过滤,您可以使用JMES路径语法用于使用--query标志进行过滤。

这是一个使用该--query标志来获取所需输出的示例。

注意:有很多方法可以使用--query+组合--filter甚至--query单独使用来对其进行切片和切块。

aws ec2 describe-security-groups --group-ids sg-xxxxxxxxx --filter 'Name=ip-permission.from-port,Values=[22]' 'Name=ip-permission.to-port,Values=[22]' --query 'SecurityGroups[*].IpPermissions[?FromPort == `22` && ToPort == `22`].IpRanges[*].[CidrIp,Description]' --region <AWS_REGION> --profile <PROFILE> --output text

每个 API 方法都提供特定的过滤器,您可以在服务器端的响应中“搜索”这些过滤器,因此请参阅 API 调用的文档。

还要注意--output text使用的内容,这才是真正以您专门寻找的格式输出的内容,尽管它只是一个空格而不是制表符。

您会注意到我使用了 EC2 SG API 提供的过滤器(例如 ip-permission.to-port)。另外,请注意上面这个命令中使用的反引号,在我的 Mac 上它运行良好。

相关内容