【发布时间】:2014-10-17 02:52:57
【问题描述】:
我正在使用 AWS CLI 为这样的特定实例获取 BlockDeviceMappings 数组,
awscli 查询
aws ec2 describe-instances --filters "Name=tag:Name,Values=mongodb-*" "Name=private-ip-address,Values=$MEMBER_IP" \
--output json --query "Reservations[*].Instances[*].BlockDeviceMappings[*]
输出
[
[
[
{
"DeviceName": "/dev/xvda",
"Ebs": {
"Status": "attached",
"DeleteOnTermination": true,
"VolumeId": "vol-xvda-xxx",
"AttachTime": "2014-10-13T14:40:13.000Z"
}
},
{
"DeviceName": "/dev/sdb",
"Ebs": {
"Status": "attached",
"DeleteOnTermination": false,
"VolumeId": "vol-sdb-xxxx",
"AttachTime": "2014-10-13T14:40:13.000Z"
}
},
{
"DeviceName": "/dev/sdc",
"Ebs": {
"Status": "attached",
"DeleteOnTermination": false,
"VolumeId": "vol-sdc-xxx",
"AttachTime": "2014-10-13T14:40:13.000Z"
}
},
{
"DeviceName": "/dev/sdd",
"Ebs": {
"Status": "attached",
"DeleteOnTermination": false,
"VolumeId": "vol-sdd-xxx",
"AttachTime": "2014-10-13T14:40:13.000Z"
}
}
]
]
]
期望的输出
我想要一个分别为 /dev/sdb、/dev/sdc 和 /dev/sdd 的卷 ID 列表。
vol-sdb-xxxxx, vol-sdc-xxxx, vol-sdd-xxxxx
我尝试使用 jq 通过管道将 aws-cli 输出传送到 jq 进行解析,但我不断收到“jq: error: Cannot index array with string”。
另外,DeviceName 可能并不总是按照我可以假设数组中的第二、第三和第四个元素的顺序正确的顺序出现,所以我想确保如果可能,volume-ids 的期望输出始终采用以下形式:sdb、sdc、sdd。
更新 1
在尝试了 Jeff 的两个建议后:
建议 1
aws ec2 describe-instances --filters "Name=tag:Name,Values=mongodb-*" "Name=private-ip-address,Values=$MEMBER_IP" --output json --query "Reservations[*].Instances[*].BlockDeviceMappings[*]" | jq 'select(.DeviceName? | test("/dev/sd[bcd]")) | .Ebs.VolumeId'
error: test is not defined
select(.DeviceName? | test("/dev/sd[bcd]")) | .Ebs.VolumeId 1 compile error
[Errno 32] Broken pipe
建议 2
aws ec2 describe-instances --filters "Name=tag:Name,Values=mongodb-*" "Name=private-ip-address,Values=$MEMBER_IP" --output json --query "Reservations[*].Instances[*].BlockDeviceMappings[*]" | jq 'select(
.DeviceName? as $dn
| ["b","c","d"]
| map($dn == "/dev/sd\(.)")
| any
)
| .Ebs.VolumeId'
没有输出
我正在使用我认为是最新的 jq-1.4。
更新 2
以下适用于 jq-1.4,
aws ec2 describe-instances --filters "Name=tag:Name,Values=mongodb-*" "Name=private-ip-address,Values=$MEMBER_IP" --output json --query "Reservations[*].Instances[*].BlockDeviceMappings[*]" | jq '.. | select(.DeviceName? as $dn | ["b","c","d"] | map($dn == "/dev/sd\(.)") | any) | .Ebs.VolumeId'
【问题讨论】:
-
如果指定文本作为输出,如何获取 JSON? (docs.aws.amazon.com/cli/latest/userguide/…)
-
是的,我的错。更新以反映 json 选项。
-
您可以使用文本输出而不是 JSON 输出来简化解析
标签: json amazon-web-services aws-cli jq