c-g*_*cia 28 amazon-ec2 amazon-web-services aws-cli jmespath
使用aws-cli 1.3.6我试图用名称和状态获得一个简单的ec2实例表.我一直在查看--query和JMESpath文档,我已经能够选择Map的"Value"项,其中"Key"项等于Name.这对于获取实例名称很有用.因此,下面的代码似乎工作
aws ec2 describe-instances --output table --query 'Reservations[].Instances[].Tags[?Key==`Name`].Value'
Run Code Online (Sandbox Code Playgroud)
并提供这个:
-------------------
|DescribeInstances|
+-----------------+
| Name1 |
| Name2 |
+-----------------+
Run Code Online (Sandbox Code Playgroud)
但是,如果我想添加状态,事情就会像我预期的那样得到.运用
aws ec2 describe-instances --output table --query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value,State.Name]'
Run Code Online (Sandbox Code Playgroud)
提供
-------------------
|DescribeInstances|
+-----------------+
| Name1 |
| stopped |
| Name2 |
| stopped |
+-----------------+
Run Code Online (Sandbox Code Playgroud)
而不是具有名称和状态的两列表.
如果我们将输出转换为JSON,我们可以看到Tags选项返回一个列表(单元素列表),这可能是问题所在:
[
[
[
"Name1"
],
"stopped"
],
[
[
"Name2"
],
"stopped"
]
]
Run Code Online (Sandbox Code Playgroud)
我无法通过选择第一个元素将此列表转换为标量.这个,不起作用.返回一个空列表作为名称.
aws ec2 describe-instances --output json --query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value[0],State.Name]'
Run Code Online (Sandbox Code Playgroud)
和此一样
aws ec2 describe-instances --output json --query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value[][0],State.Name]'
Run Code Online (Sandbox Code Playgroud)
我解决这个问题的唯一方法是通过join函数.因为我只期待一个元素,所以可以,但我似乎有点hacky.
aws ec2 describe-instances --output table --query 'Reservations[].Instances[].[join(`,`,Tags[?Key==`Name`].Value),State.Name]'
---------------------------
| DescribeInstances |
+-------------+-----------+
| Name1 | stopped |
| Name2 | stopped |
+-------------+-----------+
Run Code Online (Sandbox Code Playgroud)
因此,问题是:是否有任何方法可以选择过滤器结果的第一个元素,因为(?Key==XXXX)它后缀[0]似乎不起作用?
提前致谢!
Ste*_*pel 26
因此,问题是:有没有办法选择过滤器结果的第一个元素(?键== XXXX),记住用[0]后缀它似乎不起作用?
你提出这个问题的方式实际上暗示了解决方案,即管道表达式(仅适用于aws-cli的 1.3.7版本,因此无法在提问时弄清楚):
Run Code Online (Sandbox Code Playgroud)pipe-expression = expression "|" expression管道表达式组合了两个表达式,由|分隔 字符.它类似于具有两个重要区别的子表达式:
- 任何表达都可以在右侧使用.子表达式限制可以在右侧使用的表达式类型.
- 管道表达式停止左侧的投影以传播到右侧.如果左表达式创建投影,则它不适用于右侧.
强调部分是关键,如后续示例所示,特别是:
如果您只想要第一个子列表["first1","second1"],则可以使用管道表达式:
Run Code Online (Sandbox Code Playgroud)foo[*].bar[0] -> ["first1", "first2"] foo[*].bar | [0] -> ["first1", "second1"]
因此,应用管道表达式会产生所需的结果:
aws ec2 describe-instances --output table \
--query 'Reservations[].Instances[].[Tags[?Key==`Name`] | [0].Value, State.Name]'
----------------------------------
| DescribeInstances |
+--------------------+-----------+
| Name1 | stopped |
| Name2 | stopped |
+--------------------+-----------+
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12692 次 |
| 最近记录: |