我从description -instances中获得了以下内容:
{
"Reservations": [
{
"Instances": [
{
"PublicDnsName": "ec2-xxxxx.amazonaws.com",
"Tags": [
{
"Key": "Name",
"Value": "yyyyy"
},
{
"Key": "budget_cluster",
"Value": "zzzzz"
},
{
"Key": "poc",
"Value": "aaaaaaa"
}
]
}
]
}
]
}
对于每个实例,我想提取PublicDnsName和"budget_cluster"标签键的值。如何在ec2 describe-instances
或jq
中做到这一点?
修改fracry的回答:
aws ec2 describe-instances --output text --query
'Reservations[].Instances[].[PublicDnsName, Tags[?Key==`budget_cluster`].Value | [0]]'
会产生:
ec2-xxxxx.amazonaws.com zzzzz
ec2-bbbbb.amazonaws.com yyyyy
我已经将输出更改为文本,它删除了尽可能多的格式,并选择了| [0]
的单个标记值,因为无论如何每个实例只会有一个。最后,我在末尾删除了[]
,这样得到的列表就不会变平。这样,在文本输出中,每个条目将在自己的行上。
您还可以通过只选择实际具有该标记的实例来使其更健壮。您可以通过进一步修改--query
参数来实现这一点,但在本例中使用--filters
参数更好,因为它执行服务端过滤。具体来说,您需要tag-key
过滤器:--filters "Name=tag-key,Values=budget_cluster"
aws ec2 describe-instances --output text
--filters "Name=tag-key,Values=budget_cluster" --query
'Reservations[].Instances[?Tags[?Key==`budget_cluster`]].[PublicDnsName, Tags[?Key==`budget_cluster`].Value | [0]]'
仍然会产生:
ec2-xxxxx.amazonaws.com zzzzz
ec2-bbbbb.amazonaws.com yyyyy
但是通过网络,您将只获得您关心的实例,从而节省带宽费用。
使用jq 1.5或更高版本时,最简单的方法是使用from_entries
。
对说明性输入进行最小修复后,执行以下调用:
$ jq '.Reservations[]
| .Instances[]
| [.PublicDnsName, (.Tags|from_entries|.budget_cluster)]' input.json
生产:
[
"ec2-xxxxx.amazonaws.com",
"zzzzz"
]
如果您没有jq 1.5或更高版本,下面应该可以工作:
$ jq1.4 '.Reservations[]
| .Instances[]
| [.PublicDnsName, (.Tags[]|select(.Key=="budget_cluster") | .Value)]' input.json
@peak的回答很好,我一直在向他学习jq
部分,但是你可以从AWS CLI中实现很多东西
aws ec2 describe-instances --query
'Reservations[].Instances[].{PublicDnsName:PublicDnsName, Budget:Tags[?Key==`budget_cluster`].Value}'
将产生
[
{
"PublicDnsName": "ec2-xxxxx.amazonaws.com",
"Budget": [
"zzzz",
]
}
]
如果你不想创建一个新的严格的JSon,只要取值
aws ec2 describe-instances --query
'Reservations[].Instances[].[PublicDnsName, Tags[?Key==`budget_cluster`].Value][]'
将产生
[
"ec2-xxxxx.amazonaws.com",
[
"zzzz"
]
]