如何告诉jq从aws ec2 cli打印多个字段(键)

时间:2016-10-05 00:46:18

标签: json amazon-ec2 jq

运行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这样做,所以我可以处理结果。

1 个答案:

答案 0 :(得分:4)

仅使用AWS CLI

我喜欢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"