如何在AWS CLI筛选器中使用正则表达式

5
我正在使用AWS命令行界面(CLI)从AWS中列出一些AMI镜像。镜像的名称看起来像这样:
XY_XYZ_Docker_1.13_XYZ_XXYY
在使用时,可以使用以下命令:
aws ec2 describe-images --filters 'Name=name,Values="*_Docker_1.13_*"'

这个程序的工作效果符合预期。

现在我想用正则表达式代替静态值来进行名称筛选。从AWS文档中我了解到,可以通过正则表达式进行筛选

我的思路如下:

aws ec2 describe-images --filters 'Name=name,Values="[_]Docker[_][0-9][.][0-9]{2}[_]"'

对于此项操作,结果始终为null。我尝试了不同的正则表达式引用方式。

2:

[_]Docker[_][0-9][.][0-9]{2}[_]

(不需要引号)会导致

解析参数“--filters”时出错:期望:“,”,但收到的是“D”,输入为: Name=name,Values=[]Docker[][0-9][.][0-9]{2}[_]

3:

 *[_]Docker[_][0-9][.][0-9]{2}[_]*

使用Asterisk(星号)会导致以下结果:

解析参数“--filters”时出错:期望:',',但收到了']',输入为: Name=name,Values=[_]Docker[_][0-9][.][0-9]{2}[_]


您是否考虑将AWS CLI的输出导入到类似于“grep”的工具中,然后使用该工具的正则表达式支持? - Adil B
我不想这样做,因为我还有更多的筛选器,而按名称过滤器需要放在开头。 - uwieuwe4
1
AWS CLI使用JMESPath。请参阅:JMESPath教程 - John Rotenstein
2个回答

3

我找不到Jmespath或--filters标志是否支持正则表达式,所以我只是将其传递给Python来运行正则表达式。

aws ec2 describe-images --filters 'Name=name,Values="*Docker*"' | \
python -c '
import json, sys, re
obj = json.load(sys.stdin)
matched_images = {"Images":[]}
for image in obj["Images"]:
  if len(re.findall(r"[Dd]ocker\s?[0-9][.][0-9]{2}", image["Name"])) > 0:
    matched_images["Images"].append(image)
print json.dumps(matched_images)
'

如果需要,您可以使用管道字符“|”将输出(即JSON字符串)传输到下一个bash命令中。这可能可以解决使用grep的问题,因为它返回一个JSON字符串而不是普通文本。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接