【问题标题】:How to use Regular Expression in AWS CLI Filter如何在 AWS CLI 过滤器中使用正则表达式
【发布时间】:2018-11-16 04:29:16
【问题描述】:

我正在使用 AWS 命令​​行界面 (CLI) 列出来自 AWS 的一些 AMI 映像。 图像的名称如下:

XY_XYZ_Docker_1.13_XYZ_XXYY

使用时

aws ec2 describe-images --filters 'Name=name,Values="*_Docker_1.13_*"'

它按预期工作。

现在我想为名称过滤器使用正则表达式而不是静态值。 在 AWS 文档中,我阅读了 RegEx is possible 的过滤 我的做法是:

1:

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

结果总是null。我尝试了引用 RegEx 的不同方式。

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}[_]*

(带星号)导致

错误解析参数'--filters':预期:',',接收:']'输入: Name=name,Values=[_]Docker[_][0-9][.][0-9]{2}[_]

【问题讨论】:

  • 您是否考虑将 AWS CLI 的输出通过管道传输到 grep 之类的东西,然后使用该工具的正则表达式支持?
  • 我不想这样做,因为我还有一些过滤器,并且按名称过滤器需要在开头
  • AWS CLI 使用 JMESPath。见:JMESPath Tutorial

标签: amazon-web-services command-line-interface


【解决方案1】:

我无法找到 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 字符串而不是常规文本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-18
    相关资源
    最近更新 更多