【问题标题】:retrieve multiple values from json array using bash使用 bash 从 json 数组中检索多个值
【发布时间】:2015-08-26 14:33:30
【问题描述】:

我需要编写一个 bash 脚本来根据卷的名称标签将 Amazon EBS 卷附加到给定实例。标签的格式为“服务器名称上的设备”,例如"/dev/xvdf on linuxserver"

我可以轻松地执行以下命令来检索所有相关实例,但是我无法遍历 json 数组中的每个对象以获取 VolumeId 和 Name 标签。

aws ec2 describe-volumes --region $region --filter Name=tag-key,Values="Name" Name=tag-value,Values="*$servername" --filter Name="status",Values="available" | jq '.Volumes[]'

一个示例输出是:

 [
  {
    "AvailabilityZone": "us-east-1d",
    "Attachments": [],
    "Tags": [
      {
        "Value": "/dev/xvdg on linuxserver",
        "Key": "Name"
      }
    ],
    "Encrypted": false,
    "VolumeType": "io1",
    "VolumeId": "vol-0233d8ec",
    "State": "available",
    "Iops": 120,
    "SnapshotId": "",
    "CreateTime": "2015-08-21T04:29:10.157Z",
    "Size": 4
  },
  {
    "AvailabilityZone": "us-east-1d",
    "Attachments": [],
    "Tags": [
      {
        "Value": "/dev/xvdf on linuxserver",
        "Key": "Name"
      }
    ],
    "Encrypted": false,
    "VolumeType": "io1",
    "VolumeId": "vol-433bc8ae",
    "State": "available",
    "Iops": 120,
    "SnapshotId": "",
    "CreateTime": "2015-08-21T04:28:23.819Z",
    "Size": 4
  }
]

理想情况下,我想做以下事情:

for object in $(aws ec2 describe-volumes --region $region --filter Name=tag-key,Values="Name" Name=tag-value,Values="*$servername" --filter Name="status",Values="available" | jq '.Volumes[]')
do
    echo $object.VolumeId
done 

但是 bash 将每一行视为数组中的一个对象。

我非常感谢一些关于解决此问题的更好方法的建议。

谢谢

【问题讨论】:

    标签: json bash amazon-web-services


    【解决方案1】:

    jq package 可能会对您有所帮助。它的创建是为了填补使用 bash 脚本解析 JSON 能力的空白。

    如何从样本数据中获取卷 ID 的示例:

    aws ec2 describe-volumes --region $region --filter Name=tag-key,Values="Name"\
        Name=tag-value,Values="*$servername" --filter Name="status",Values="available"\
        | jq .[].VolumeId
    

    输出:

    "vol-0233d8ec"
    "vol-433bc8ae"
    

    您可以将其拆分为像这样的数组对其进行迭代:

    #!/bin/bash
    
    volumeIds=$(aws ec2 describe-volumes --region $region --filter Name=tag-key,Values="Name"\
        Name=tag-value,Values="*$servername" --filter Name="status",Values="available"\
        | jq .[].VolumeId)
    
    for i in `echo "$volumeIds"`
    do
      echo "$i is a volume ID"
    done
    
    # "vol-0233d8ec" is a volume ID
    # "vol-433bc8ae" is a volume ID
    

    【讨论】:

    • 它似乎不再有效:[ec2-user@ip-10-0-0-113 tmp]$ aws ec2 describe-volumes --region $REGION | jq .[].VolumeIdjq: error (at <stdin>:90): Cannot index array with string "VolumeId"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 2020-06-08
    • 1970-01-01
    • 2016-10-31
    • 2012-03-04
    • 1970-01-01
    相关资源
    最近更新 更多