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

Mic*_*nez 3 amazon-ec2 json

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

{
    "Reservations": [
        {
            "Instances": [
                  "PublicDnsName": "ec2..."
                    "VpcId": "vpc-...",
                        ...
            "Instances": [
Run Code Online (Sandbox Code Playgroud)

我知道对于每个“实例”我可以提取单个字段的内容,例如 PublicDnsName,使用 jq 如下: jq '.Reservations[].Instances[].PublicDnsName'它将列出我实例的 dns 名称但是我如何提取两个或多个字段并用空格分隔它们或逗号什么的?我希望为每个实例并排列出 PublicDnsName 和 VpcId。

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

小智 5

这是一种使用一些示例代码和数据的方法,这些示例代码和数据来自对 Stack Overflow 上类似问题的回答

要选择多个字段,您可以使用Object Construction。例如,这个过滤器使一个对象只包含PublicDnsNameVpcId来自每个实例:

  .Reservations[]
| .Instances[]
| {PublicDnsName, VpcId}
Run Code Online (Sandbox Code Playgroud)

如果此过滤器在filter.jq并且来自其他答案的示例数据在data.json然后运行

$ jq -M -f filter.jq data.json
Run Code Online (Sandbox Code Playgroud)

产生

{
  "PublicDnsName": "xxxxxxxx",
  "VpcId": "vpc-eb09eb8e"
}
Run Code Online (Sandbox Code Playgroud)

一旦您拥有包含您想要的数据的对象,将数据转换为另一种格式(例如 csv)就很容易了。有了这个过滤器

  .Reservations[]
| .Instances[]
| {PublicDnsName, VpcId}
| [.[]]
| @csv
Run Code Online (Sandbox Code Playgroud)

-r选项

$ jq -M -r -f filter.jq data.json
Run Code Online (Sandbox Code Playgroud)

jq 生产

"xxxxxxxx","vpc-eb09eb8e"
Run Code Online (Sandbox Code Playgroud)

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

  .Reservations[]
| .Instances[]
| {PublicDnsName, VpcId}
| select(.VpcId != null)
| [.[]]
| @csv
Run Code Online (Sandbox Code Playgroud)

  • 仅供像我这样比 jq17027 缺乏 jq 专家的人参考:过滤器可以位于命令行中,而不必位于文件中。 (2认同)