我正在尝试过滤掉AutoScalingGroupName中包含字符串“ base”的自动缩放组。我正在尝试使用JMESpath查询语言,但找不到仅用于键的按值过滤的任何示例。
import boto3
session = boto3.Session(profile_name='prod')
asg_client = session.client(
'autoscaling',
region_name='us-west-1'
)
paginator = asg_client.get_paginator('describe_auto_scaling_groups')
page_iterator = paginator.paginate(
PaginationConfig={'PageSize': 100}
)
filtered_asgs = page_iterator.search(
'AutoScalingGroups[] | AutoScalingGroupName[?!contains(@, `{}`)]'.format('base')
)
for asg in filtered_asgs:
pprint.pprint(asg)
这返回
None
None
我也尝试过
filtered_asgs = page_iterator.search('AutoScalingGroups[] | [?contains(AutoScalingGroupName[].Value, `{}`)]'.format('base'))
jmespath.exceptions.JMESPathTypeError: In function contains(), invalid type for value: None, expected one of: ['array', 'string'], received: "null"
这是正确的语法:
substring = 'base'
filtered_args = page_iterator.search(f"AutoScalingGroups[?!contains(AutoScalingGroupName,`{substring}`)][]")
如果您更喜欢f字符串而不是“ format-syntax”,那么您当然也可以这样写:
filtered_args = page_iterator.search("AutoScalingGroups[?!contains(AutoScalingGroupName,`{}`)][]".format(substring))
如果子字符串“ base”是常量,则也可以将其直接写入表达式中:
filtered_args = page_iterator.search("AutoScalingGroups[?!contains(AutoScalingGroupName,`base`)][]")
大多数时候,您对响应语法的全部内容都不感兴趣。如果您只关心组名,可以编写:
filtered_args = (page['AutoScalingGroupName'] for page in page_iterator.search("AutoScalingGroups[?!contains(AutoScalingGroupName,`base`)][]"))
如果您更喜欢列表而不是生成器,则可以简单地用方括号替换周围的括号:
filtered_args = [page['AutoScalingGroupName'] for page in page_iterator.search("AutoScalingGroups[?!contains(AutoScalingGroupName,`base`)][]")]
有没有一种简单的方法可以过滤出字符串列表?