运行aws ec2 describe-instances将返回类似于以下内容的json文本:
{
"Reservations": [
{
"Instances": [
"PublicDnsName": "ec2..."
"VpcId": "vpc-...",
...
"Instances": [
我知道每个“实例”我可以使用jq提取单个字段的内容,例如PublicDnsName,如下所示:
jq '.Reservations[].Instances[].PublicDnsName'
将列出我的实例的dns名称
但是,如何提取两个或多个字段并用空格或逗号或其他东西分隔?我希望PublicDnsName和VpcId并排列出每个实例。
具体而言,我正在寻找的是VpcId为null,未定义或不存在的实例列表。换句话说,我想要一个我的Classic实例列表,我需要通过api这样做,所以我可以处理结果。
答案 0 :(得分:4)
我喜欢jq,与aws cli结合真的很有帮助,但是你可以在你的情况下用aws cli做很多事情。
但是如何提取两个或多个字段并用空格或逗号或其他东西分隔?我希望PublicDnsName和VpcId并排列出每个实例。
aws ec2 describe-instances --query '
Reservations[*].Instances[].{PublicDnsName:PublicDnsName,VpcId:VpcId}' --output text
具体而言,我正在寻找的是VpcId为空,未定义或不存在的实例列表
如果您搜索空的VpcId,以下内容将起作用:
aws ec2 describe-instances --query '
Reservations[].Instances[?VpcId==``].[PublicDnsName]' --output text
jq
原来的问题是
如何告诉jq从aws ec2 cli打印多个字段(键)
确保您可以使用jq
,您可以通过用逗号分隔来获得包含以下内容的多个字段
aws ec2 describe-instances |\
jq '.Reservations[].Instances[].PublicDnsName, .Reservations[].Instances[].VpcId'
您可以通过分解Reservations[].Instances
:
aws ec2 describe-instances |\
jq '.Reservations[].Instances[] | .PublicDnsName, .VpcId'
和jq支持转换为csv,但它需要一个数组并避免双引号问题,你可以使用原始数据:
aws ec2 describe-instances |\
jq -r '.Reservations[].Instances[]
| [.PublicDnsName, .VpcId]
| @csv'
最后一个只会产生预期的结果:
"ec2-some_id_region.amazonaws.com","vpc-some_other_id"