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

标签 json bash amazon-web-services

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

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

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 将每一行都视为数组中的一个对象。

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

谢谢

最佳答案

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

关于json - 使用 bash 从 json 数组中检索多个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32172066/

相关文章:

linux - 用awk实现tail

linux - 排序范围 Linux

.net - 如何使用 DynamoDBContext 批处理结果

java - Spring Cloud Config 与 AWS Java SDK 2.0

javascript - 创建带空格的 ID

ios - 使用没有属性名称的 RestKit 映射 JSON

arrays - 如何使用 jq 将字符串数组转换为对象?

java - 在 Maven 构建之后构建 "live"目录结构的正确方法?

json - 获取 package.json 文件中另一个字段的值(npm)

amazon-web-services - AWS SQS 为什么请求数如此之高