AWS cli JMESpath 查询标签值

Ell*_*t B 5 amazon-web-services aws-cli jmespath

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

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

但对于标签名称来说,它看起来像这样:

% 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  ||
|+---------------+|
Run Code Online (Sandbox Code Playgroud)

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

β.ε*_*.βε 4

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

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

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

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

Tags[?Key =='Name']|[0].Value 
Run Code Online (Sandbox Code Playgroud)

或者,与:

Tags[?Key =='Name'].Value | [0]
Run Code Online (Sandbox Code Playgroud)

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

给定 JSON:

Tags[?Key =='Name']|[0].Value 
Run Code Online (Sandbox Code Playgroud)

查询

Tags[?Key =='Name'].Value | [0]
Run Code Online (Sandbox Code Playgroud)

将会给出预期的

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

          "Tags": [
            {
              "Key": "Name",
              "Value": "Elliott-TKD"
            },
            {
              "Key": "Foo",
              "Value": "Bar"
            }
          ]
        }
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

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

Reservations[].Instances[0].[{ Property: `Name`, Value: Tags[?Key == `Name`]|[0].Value }]
Run Code Online (Sandbox Code Playgroud)