【问题标题】:AWS cli JMESpath query tag valuesAWS cli JMESpath 查询标签值
【发布时间】:2021-02-19 04:03:54
【问题描述】:

作为我的previous question 的后续行动,我无法让标签在这种类型的输出中正常工作。我想打印一个表格,每个属性作为一行。这是我期望的样子:

% aws --output table ec2 describe-instances --instance-id $id --query "Reservations[].Instances[0].[{ Property: 'Type', Value: InstanceType }]"         
-------------------------------
|      DescribeInstances      |
+-----------+-----------------+
| Property  |      Value      |
+-----------+-----------------+
|  Type     |  g4dn.12xlarge  |
+-----------+-----------------+

但是使用标签名称它看起来像这样:

% aws --output table ec2 describe-instances --instance-id $id --query "Reservations[].Instances[0].[{ Property: 'Name', Value: Tags[?Key =='Name'].Value }]"   
-------------------
|DescribeInstances|
+-----------------+
|    Property     |
+-----------------+
|  Name           |
+-----------------+
||     Value     ||
|+---------------+|
||  Elliott-TKD  ||
|+---------------+|

标记值是正确的,但格式很奇怪,当与更多其他行组合时,表格变得非常丑陋。

【问题讨论】:

  • Tags 是一个数组,你希望它如何渲染?多行,逗号分隔,否则?
  • 我正在过滤数组以获取带有.Value的单个字符串
  • 嗯,不,它仍然是一个数组:)
  • 哦!好的,我看你是对的。那么有没有办法把它变成一个字符串呢?

标签: amazon-web-services aws-cli jmespath


【解决方案1】:

查询的过滤器部分 ([?Key == 'Name']) 正在创建 JMESPath 所描述的 projection
您必须重置此投影才能从中提取单个字符串。
可以使用pipes 来重置投影。

投影是 JMESPath 中的一个重要概念。但是,有时投影语义不是您想要的。一个常见的场景是当您想要对投影结果进行操作而不是将表达式投影到数组中的每个元素上时。 例如,表达式people[*].first 将为您提供一个数组,其中包含人员数组中每个人的名字。如果您想要该列表中的第一个元素怎么办?如果您尝试people[*].first[0],您只需为人员数组中的每个元素评估first[0],并且由于没有为字符串定义索引,最终结果将是一个空数组[]。要实现所需的结果,您可以使用管道表达式 <expression> | <expression> 来指示必须停止投影。

来源:https://jmespath.org/tutorial.html#pipe-expressions

因此,您的问题非常接近他们在文档中描述的内容,并且可以使用以下方法重置该投影:

Tags[?Key =='Name']|[0].Value 

或者,与:

Tags[?Key =='Name'].Value | [0]

这是两个完全相同的查询。

鉴于 JSON:

{
  "Reservations": [
    {
      "Instances": [
        {

          "Tags": [
            {
              "Key": "Name",
              "Value": "Elliott-TKD"
            },
            {
              "Key": "Foo",
              "Value": "Bar"
            }
          ]
        }
      ]
    }
  ]
}

查询

Reservations[].Instances[0].[{ Property: `Name`, Value: Tags[?Key == `Name`]|[0].Value }]

会给出预期的

[
  [
    {
      "Property": "Name",
      "Value": "Elliott-TKD"
    }
  ]
]

所以它会在你的表格中正确呈现

------------------------------
|      DescribeInstance      |
+------------+---------------+
|  Property  |     Value     |
+------------+---------------+
|    Name    |  Elliott-TKD  |
+------------+---------------+

【讨论】:

  • 谢谢!我开始尝试编写一个非常简单的 bash 脚本,但现在我开始认为使用 boto3 在 Python 中编写它会更容易。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 1970-01-01
  • 2014-01-09
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
相关资源
最近更新 更多