首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >AWS和JMESPath过滤器和嵌套属性的选择

AWS和JMESPath过滤器和嵌套属性的选择
EN

Stack Overflow用户
提问于 2016-02-23 09:34:43
回答 2查看 1.9K关注 0票数 7

我想使用CLI工具来检索具有特定cname/别名的CloudFront发行版的分发id。

这就是我想出来的:

代码语言:javascript
运行
复制
aws cloudfront list-distributions --query "DistributionList.Items[?Aliases.Items!='null']|DistributionList.Items[?contains(Aliases.Items,'cname.cdn.mycompany.com') == 'true'].{Id:Id}"

我不是JMESPath的专家,我也不明白为什么我的查询不返回结果。存在以指定域为别名的发行版。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-02-24 16:07:47

你离我很近!不过,有几件事:

  • null不是'null'
  • 在管道之后,您将处理第一个表达式的结果
  • null一样,true不是一个字符串(== true也是多余的)

jmespath.org有一个可以用来测试表达式的实时编辑器。下面是一个简化的json,我们可以用它来测试这个案例:

代码语言:javascript
运行
复制
{
    "DistributionList": {
        "Items": [
            {
                "Id": "foo",
                "Aliases": {
                    "Quantity": 1,
                    "Items": [
                        "cname.cdn.mycompany.com"
                    ]
                }
            },
            {
                "Id": "bar",
                "Aliases": {
                    "Quantity": 1,
                    "Items": [
                        "cname.cdn.othercompany.com"
                    ]
                }
            },
            {
                "Id": "baz",
                "Aliases": {
                    "Quantity": 0
                }
            }
        ]
    }
}

让我们从表达式的第一部分开始。唯一需要的修复方法是去掉null的引号:

代码语言:javascript
运行
复制
DistributionList.Items[?Aliases.Items!=null]

它将成功地过滤掉在Alias下不使用Alias的元素。这是如果你停在这里你会得到的回报,以及你在管道之后要做的事情:

代码语言:javascript
运行
复制
[
  {
    "Id": "foo",
    "Aliases": {
      "Quantity": 1,
      "Items": [
        "cname.cdn.mycompany.com"
      ]
    }
  },
  {
    "Id": "bar",
    "Aliases": {
      "Quantity": 1,
      "Items": [
        "cname.cdn.othercompany.com"
      ]
    }
  }
]

请注意,再也没有DistributionList.Items了。

所以现在我们要过滤一个特定的CNAME。让我们省略重言式== true

代码语言:javascript
运行
复制
[?contains(Aliases.Items, 'cname.cdn.mycompany.com')]

所以现在完整的表达是:

代码语言:javascript
运行
复制
DistributionList.Items[?Aliases.Items!=null] | [?contains(Aliases.Items, 'cname.cdn.mycompany.com')]

您的结果是成功筛选的列表:

代码语言:javascript
运行
复制
[
  {
    "Id": "foo",
    "Aliases": {
      "Quantity": 1,
      "Items": [
        "cname.cdn.mycompany.com"
      ]
    }
  }
]

现在,如果您想要匹配元素的Id,只需将.Id添加到最后一个表达式。如果您知道只有一个元素,您可以使用另一个管道和[0]来选择该元素。

代码语言:javascript
运行
复制
DistributionList.Items[?Aliases.Items!=null] | [?contains(Aliases.Items, 'cname.cdn.mycompany.com')].Id | [0]

你拿到了你想要的身份证!

代码语言:javascript
运行
复制
"foo"
票数 17
EN

Stack Overflow用户

发布于 2021-06-03 07:21:52

加一句,我是在没有管子的情况下发现的。

aws cloudfront list-distributions --query "DistributionList.Items[?contains(Aliases.Items, 'cname.cdn.mycompany.com')].Id" --output text

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35573727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档