我使用以下内容来查找与特定安全组关联的实例的信息
aws ec2 describe-network-interfaces --filters Name=group-id,Values=sg-123456 --output json
Run Code Online (Sandbox Code Playgroud)
这返回(部分输出)
{
"NetworkInterfaces": [
{
"Attachment": {
"AttachTime": "2019-10-09T07:15:44+00:00",
"AttachmentId": "eni-attach-01234567",
"InstanceId": "i-12345678",
"InstanceOwnerId": "123456789",
"Status": "attached"
},
"AvailabilityZone": "us-east-1c",
"Description": "Primary network interface",
"Groups": [
{
"GroupName": "sg-number1",
"GroupId": "sg-123456"
},
{
"GroupName": "sg-number_2",
"GroupId": "sg-654321"
}
],
Run Code Online (Sandbox Code Playgroud)
如果我只想获取实例 ID,那么我可以使用 --query 并沿着树向下查找
--query 'NetworkInterfaces[*].Attachment.InstanceId'
Run Code Online (Sandbox Code Playgroud)
我也可以做类似的事情来获得所有 SG
--query 'NetworkInterfaces[*].Groups[*].GroupId'
Run Code Online (Sandbox Code Playgroud)
我的问题是如何在一个查询中获取 InstanceID 和 Group.GroupName ?
或者更好的是,当这些属性处于同一级别时,如何查询多个属性?
以下内容无效:
--query 'NetworkInterfaces[*].Attachment.InstanceId','NetworkInterfaces[*].Groups[*].GroupName'
Run Code Online (Sandbox Code Playgroud) amazon-ec2 amazon-web-services aws-cli jmespath aws-security-group
我有一个典型的.json文件,用于Chef,例如servername.json
{
"name": "myserver123",
"chef_environment": "test",
"run_list": [
"role[base-pkg]",
"role[interesting_stuff]",
"role[user_apps]"
]
}
Run Code Online (Sandbox Code Playgroud)
我想要做的是在文件中找到最后一个角色后使用"一行"来添加新角色.因为我从来不知道文件中有什么角色或有多少我想要搜索最后的结束"]"括号并在上面添加新角色.
我尝试了以下方法:
tac servername.json | sed -i '0,/\]/a "role[My_New_Role]"'
Run Code Online (Sandbox Code Playgroud)
认为这会找到(现在)第一个"]"并在其后添加新行.但是,当我运行cmd时,它会添加"role [My_New_Role]"行3次.两次之前"]"和一次之后的正确位置"]"
问题:
1)当"0"表示匹配一次时,为什么该行加3次?
2)使用AWK,Perl或Python(2.7.5)可以做得更好吗?怎么样 ?
3)我应该使用正则表达式前瞻/后面而不是tac吗?
4)因为我需要再次处理文件以向倒数第二个角色添加逗号我的整个方法是错误的?什么是更好的方法?