如何告诉jq打印每个由aws ec2 cli返回的实例的两个键的内容

运行aws ec2 describe-instances将返回类似于以下内容的json文本:

{ "Reservations": [ { "Instances": [ "PublicDnsName": "ec2..." "VpcId": "vpc-...", ... "Instances": [ 

我知道每个“实例”我可以提取单个字段的内容,例如PublicDnsName,使用jq如下: jq '.Reservations[].Instances[].PublicDnsName'将列出我的实例的dns名称但是如何我提取两个或更多的领域,并用空格或逗号分隔吗? 我想要PublicDnsName和VpcId并列列出每个实例。

具体而言,我正在寻找的是VpcId为空,未定义或不存在的实例列表。 换句话说,我想要一个我的经典实例的列表,我需要通过api,所以我可以处理结果。

这里是一个使用一些示例代码和数据从我的答案堆栈溢出类似的问题 。

要select多个字段,可以使用Object Construction 。 例如,这个过滤VpcId每个实例只包含PublicDnsNameVpcId的对象:

  .Reservations[] | .Instances[] | {PublicDnsName, VpcId} 

如果此filter位于filter.jq并且来自其他答案的样本数据位于data.json则会运行

 $ jq -M -f filter.jq data.json 

产生

 { "PublicDnsName": "xxxxxxxx", "VpcId": "vpc-eb09eb8e" } 

一旦你有对象包含你想要的数据到另一种格式(如csv)很容易。 有了这个filter

  .Reservations[] | .Instances[] | {PublicDnsName, VpcId} | [.[]] | @csv 

-r选项

 $ jq -M -r -f filter.jq data.json 

jq产生

 "xxxxxxxx","vpc-eb09eb8e" 

要添加过滤条件,例如VpcId不为空,请添加一个select 。

  .Reservations[] | .Instances[] | {PublicDnsName, VpcId} | select(.VpcId != null) | [.[]] | @csv