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

How to tell jq to print multiples fields(keys) from aws ec2 cli

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

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

我知道对于每个 "Instance" 我可以使用 jq 提取单个字段的内容,例如 PublicDnsName,如下所示: jq '.Reservations[].Instances[].PublicDnsName' 这将列出我的实例的 dns 名称 但是我如何提取两个或更多字段并用 space 或逗号或其他东西分隔它们?我希望为每个实例并排列出 PublicDnsName 和 VpcId。

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

单独使用 AWS CLI

我喜欢 jq,它与 aws cli 结合使用真的很有帮助,但在您的情况下,您已经可以简单地使用 aws cli 做很多事情。

But how do I extract two or more fields and separate them by a space or comma or something? I want PublicDnsName and VpcId to be listed side-by-side for each Instance.

aws ec2 describe-instances --query '
  Reservations[*].Instances[].{PublicDnsName:PublicDnsName,VpcId:VpcId}' --output text

Specifically what I'm looking for is a list of instances where VpcId is null, undefined, or non-existent

如果您搜索空的 VpcId,以下将起作用:

aws ec2 describe-instances --query '
  Reservations[].Instances[?VpcId==``].[PublicDnsName]' --output text

jq一起工作

因为原问题是

How to tell jq to print multiples fields(keys) from 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"