使用jq从EC2实例中获取Name标记的值



我正在尝试使用jq获取AWS EC2实例的Name标记的值。

aws ec2 describe-instances | jq -r '.Reservations[].Instances[] | .Tags[] | select (.Key == "Name")'

但我得到了这个错误:

jq: error: Name/0 is not defined at <top-level>, line 1:
.Reservations[].Instances[] | .Tags[] | select (.Key == Name)
jq: 1 compile error

这是我试图处理的json:

{
"Reservations": [{
"Instances": [{
"AmiLaunchIndex": 0,
"ImageId": "ami-00c3c949f325a4149",
"InstanceId": "i-0c17052ee1c7113e5",
"Architecture": "x86_64",
"Tags": [{
"Key": "Name",
"Value": "bastion001"
},
{
"Key": "environment",
"Value": "stg-us-east"
}
]
}]
}]
}

如何从EC2实例中获取Name标记的值?

您不需要像jq这样的额外工具来查询输出。AWS CLI具有JMESPath内置以帮助您做到这一点。

aws ec2 describe-instances --query 'Reservations[*].Instances[*].Tags[?Key == `Name`].Value'

你可以这样做,这将在逗号分隔的列表中从ec2获得你想要的东西

jq -r '.Reservations[].Instances[]  | ((.Tags // empty) | from_entries) as $tags | [($tags.Name), ($tags.environment), .ImageId, .InstanceId, .AmiLaunchIndex] | @csv'

如果您想知道,.Tags // empty将忽略那些带有不存在的标记的内容。

希望这能有所帮助,这是正确的,你不需要jq来获得这些细节,但这就是你使用的方式:(

Q中显示的jq命令行表达式与错误消息不匹配。我建议,至少在解决问题之前,将jq程序放在一个文件中,并使用-f命令行选项调用jq。

最新更新