使用bash从json数组中检索多个值

时间:2015-08-23 22:11:42

标签: json bash amazon-web-services

我需要编写一个bash脚本,根据卷的Name标签将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将每一行视为数组中的一个对象。

我非常感谢有关更好地解决这个问题的一些建议。

由于

1 个答案:

答案 0 :(得分: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