使用aws-cli 1.3.6我试图用名称和状态获取一个简单的ec2实例表。我一直在查看--query和JMESpath文档,我已经能够选择" Value"地图项目" Key" item等于Name。这对于获取实例名称很有用。因此,下面的代码似乎有用
aws ec2 describe-instances --output table --query 'Reservations[].Instances[].Tags[?Key==`Name`].Value'
并提供这个:
-------------------
|DescribeInstances|
+-----------------+
| Name1 |
| Name2 |
+-----------------+
但是,如果我想添加状态,事情就会像我预期的那样得到。使用
aws ec2 describe-instances --output table --query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value,State.Name]'
推出
-------------------
|DescribeInstances|
+-----------------+
| Name1 |
| stopped |
| Name2 |
| stopped |
+-----------------+
而不是具有名称和状态的两列表。
如果我们将输出转换为JSON,我们可以看到Tags选项返回一个列表(单元素列表),这可能是问题:
[
[
[
"Name1"
],
"stopped"
],
[
[
"Name2"
],
"stopped"
]
]
我无法通过选择第一个元素将此列表转换为标量。这个,不起作用。返回一个空列表作为名称。
aws ec2 describe-instances --output json --query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value[0],State.Name]'
与此相同
aws ec2 describe-instances --output json --query 'Reservations[].Instances[].[Tags[?Key==`Name`].Value[][0],State.Name]'
我解决这个问题的唯一方法是通过join函数。因为我只期待一个元素,所以可以,但我似乎有点hacky。
aws ec2 describe-instances --output table --query 'Reservations[].Instances[].[join(`,`,Tags[?Key==`Name`].Value),State.Name]'
---------------------------
| DescribeInstances |
+-------------+-----------+
| Name1 | stopped |
| Name2 | stopped |
+-------------+-----------+
因此,问题是:有没有办法选择过滤器(?Key==XXXX)
结果的第一个元素,记住用[0]
后缀它似乎不起作用?
提前致谢!
答案 0 :(得分:24)
因此,问题是:有没有办法选择过滤器结果的第一个元素(?键== XXXX),记住用[0]后缀它似乎不起作用?
你提出这个问题的方式实际上暗示了解决方案,即Pipe Expressions(仅在aws-cli的版本1.3.7中可用,因此无法在提问时弄清楚):
pipe-expression = expression "|" expression
管道表达式组合了两个表达式,由|分隔 字符。它类似于具有两个重要的子表达式 区别:
- 任何表达都可以在右侧使用。子表达式限制可以在右侧使用的表达式类型 侧。
- 竖线表达式会停止左侧的投影以传播到右侧。如果左表达式创建了一个 投影,它不适用于右侧。
醇>
强调部分是关键,如后续示例所示,特别是:
如果您只想要第一个子列表,[“first1”,“second1”], 你可以使用管道表达式:
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 |
+--------------------+-----------+
答案 1 :(得分:1)
它告诉实例ID以及服务器状态
<强>命令:强> aws ec2 describe-instances --filter Name = tag:Name,Values = eep --query&#39; Reservations []。Instances []。{id:State,ID:InstanceId}&# 39; - 输出表
在上述命令中查询部分 它根据要求而变化 --query&#39; Reservations []。实例[]。{id:State,ID:InstanceId}&#39; - 输出表
答案 2 :(得分:0)
#!/bin/bash
for r in `aws ec2 describe-regions --query Regions[*].RegionName --output text`
do
#echo $r
aws ec2 describe-instances --region $r --query 'Reservations[*].Instances[*].{ID:InstanceId, type:InstanceType, launched:LaunchTime, name:Tags[?Key==`Name`].Value[]}' --output json | jq --arg R $r -r '.[] | .[] | [$R, .ID, .type, .launched, .name[0]] | @csv'
done
输出:
"us-east-1","i-054f8253b9ed0746d","t2.micro","2018-10-31T01:57:52.000Z","xxx"
"us-east-1","i-0638792b8b3057ce2","t2.nano","2018-10-23T03:49:24.000Z","yyy"