作为我上一个问题的后续,我在使标记在这种类型的输出中正确工作时遇到了麻烦。我想打印一个表,每个属性作为一行。我希望它看起来是这样的:
% 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 |
+------------+---------------+