javascript - 如何在 2 个 JSON 文件之间插入匹配 JSON 键的值

标签 javascript json bash amazon-web-services amazon-ec2

我有 2 个 JSON 文件:

  • JSON 模板
  • JSON 输出(来自 awscli)

模板是一个小的 JSON 文件,如下所示:

{
  "DryRun": true,
  "ImageId": "",
  "KeyName": "",
  "SecurityGroups": [
    ""
  ],
  "InstanceType": "",
  "Monitoring": {
    "Enabled": false
  },
  "SubnetId": "",
  "DisableApiTermination": true,
  "PrivateIpAddress": "",
  "IamInstanceProfile": {
    "Arn": "",
    "Name": ""
  },
  "EbsOptimized": true,
  "TagSpecifications": [{
    "ResourceType": "",
    "Tags": [{
      "Key": "",
      "Value": ""
    }]
  }]
}

原始文件是aws ec2描述实例的输出:

{
  "Reservations": [{
    "OwnerId": "123456789012",
    "ReservationId": "r-12345678",
    "Groups": [],
    "Instances": [{
      "Monitoring": {
        "State": "disabled"
      },
      "PublicDnsName": "ec2-12-34-56-78.ap-southeast-1.compute.amazonaws.com",
      "RootDeviceType": "ebs",
      "State": {
        "Code": 16,
        "Name": "running"
      },
      "EbsOptimized": false,
      "LaunchTime": "2016-02-09T03:06:21.000Z",
      "PublicIpAddress": "12.34.56.78",
      "PrivateIpAddress": "172.31.1.2",
      "ProductCodes": [],
      "VpcId": "vpc-1a2b3c4d",
      "StateTransitionReason": "",
      "InstanceId": "i-abcd1234",
      "ImageId": "ami-1234abcd",
      "PrivateDnsName": "ip-172-31-1-2.ap-southeast-1.compute.internal",
      "KeyName": "tempKey",
      "SecurityGroups": [{
          "GroupName": "somegroup1",
          "GroupId": "sg-ZZZZZ"
        },
        {
          "GroupName": "somegroup2",
          "GroupId": "sg-YYYYY"
        }
      ],
      "ClientToken": "NutKc123456789012",
      "SubnetId": "subnet-00001234",
      "InstanceType": "t2.medium",
      "NetworkInterfaces": [{
        "Status": "in-use",
        "MacAddress": "02:AA:BB:CC:DD:EE",
        "SourceDestCheck": true,
        "VpcId": "vpc-1a2b3c4d",
        "Description": "",
        "Association": {
          "PublicIp": "12.34.56.78",
          "PublicDnsName": "ec2-12-34-56-78.ap-southeast-1.compute.amazonaws.com",
          "IpOwnerId": "123456789012"
        },
        "NetworkInterfaceId": "eni-XXXXXXXX",
        "PrivateIpAddresses": [{
          "PrivateDnsName": "ip-172-31-1-2.ap-southeast-1.compute.internal",
          "Association": {
            "PublicIp": "1.2.3.4",
            "PublicDnsName": "ec2-12-34-56-78.ap-southeast-1.compute.amazonaws.com",
            "IpOwnerId": "123456789012"
          },
          "Primary": true,
          "PrivateIpAddress": "172.31.1.2"
        }],
        "PrivateDnsName": "ip-172-31-1-2.ap-southeast-1.compute.internal",
        "Attachment": {
          "Status": "attached",
          "DeviceIndex": 0,
          "DeleteOnTermination": true,
          "AttachmentId": "eni-attach-XXXXXXXX",
          "AttachTime": "2016-01-13T08:33:37.000Z"
        },
        "Groups": [{
            "GroupName": "somegroup1",
            "GroupId": "sg-ZZZZZZ"
          },
          {
            "GroupName": "somegroup2",
            "GroupId": "sg-YYYYYY"
          }
        ],
        "Ipv6Addresses": [],
        "SubnetId": "subnet-00001234",
        "OwnerId": "123456789012",
        "PrivateIpAddress": "172.31.1.2"
      }],
      "SourceDestCheck": true,
      "Placement": {
        "Tenancy": "default",
        "GroupName": "",
        "AvailabilityZone": "ap-southeast-1b"
      },
      "Hypervisor": "xen",
      "BlockDeviceMappings": [{
        "DeviceName": "/dev/xvda",
        "Ebs": {
          "Status": "attached",
          "DeleteOnTermination": true,
          "VolumeId": "vol-33221100",
          "AttachTime": "2016-01-13T08:33:39.000Z"
        }
      }],
      "Architecture": "x86_64",
      "StateReason": {
        "Message": "Client.UserInitiatedShutdown: User initiated shutdown",
        "Code": "Client.UserInitiatedShutdown"
      },
      "RootDeviceName": "/dev/xvda",
      "VirtualizationType": "hvm",
      "Tags": [{
          "Value": "SomeValue",
          "Key": "SomeKey"
        },
        {
          "Value": "AnotherValue",
          "Key": "Name"
        }
      ],
      "AmiLaunchIndex": 0
    }]
  }]
}

我想将原始 JSON 文件中的 Key 值复制到模板文件中。

例如,KeyName 是 2 个 JSON 文件之间的公共(public) key 。模板文件中替换对应的值tempKey

其主要用例是:我尝试将 AWS 上的多个服务器从一个区域迁移到另一个区域。这是迁移过程的一部分,它将消除 AWS 控制台上的大量手动单击和配置。

注意:我使用 BASH 命令行。

最佳答案

有一种方法可以使用jq来做到这一点但它不接受 JSON 模板作为输入。

您必须将其修改为查询。这不是您需要的实际查询,而是帮助您开始的查询:

cat temp.json | jq '.Reservations[].Instances[] |  { DryRun, ImageId, KeyName, SecurityGroups, InstanceType, Monitoring }'

哪里temp.json上面是我放入文件中的输出。对于常规命令,只需执行类似 aws ec2 describe-instances | jq ... 的操作即可

给我的输出(记住我查询的限制集)是:

{
  "DryRun": null,
  "ImageId": "ami-1234abcd",
  "KeyName": "tempKey",
  "SecurityGroups": [
    {
      "GroupName": "somegroup1",
      "GroupId": "sg-ZZZZZ"
    },
    {
      "GroupName": "somegroup2",
      "GroupId": "sg-YYYYY"
    }
  ],
  "InstanceType": "t2.medium",
  "Monitoring": {
    "State": "disabled"
  }
}

希望这有帮助。

关于javascript - 如何在 2 个 JSON 文件之间插入匹配 JSON 键的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43801298/

相关文章:

c++ - 如何在 http_request 中发送 JSON 对象以及如何在服务器上访问它?

javascript - JS : Delete Object Key if all nested Values equal null

linux - 在 Linux 中的单个列上进行 Grep

php - 为什么这个 shell 脚本没有按预期从 PHP 运行?

javascript - 基于特定列数据创建选择 - 使用 javascript

javascript - 优化 Jade 包装

javascript - JSON数组推送数组

c - 如何在 Linux 中获取本地(区域)日期格式?

javascript - 为什么导航栏不能固定到顶部?

javascript - 为什么 <a href ="myurl"type ="submit"class ="btn">Pay here</a> 会清除用户表单?