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  |
+-----------+-----------------+

但是标签名看起来是这样的:

% 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  ||
|+---------------+|

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

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

投影是JMESPath中的一个重要概念。然而,有时投影语义不是您想要的。一种常见的情况是,希望对投影的结果进行操作,而不是将表达式投影到数组中的每个元素上。例如,表达式people[*].first将为您提供一个数组,其中包含people数组中每个人的名字。如果你想要列表中的第一个元素呢?如果您尝试people[*].first[0],则只需对people数组中的每个元素计算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  |
+------------+---------------+

相关内容

  • 没有找到相关文章

最新更新