我确信这不是最有效的方法,但我需要帮助格式化此 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
标志来获取必要的格式和输出。
该--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 上它运行良好。