[英]How to parse AWS CLI json output using jq to get array of volume-ids?
我正在使用AWS CLI獲取像這樣的特定實例的BlockDeviceMappings
數組,
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
我試圖通過將aws-cli輸出傳遞給jq
來使用jq
進行解析,但是我不斷收到“ jq:error:Cannot index array with string”。
另外, DeviceName
可能不一定總是以我可以假設數組中的第2、3rd和4th個元素的順序正確的順序出現,因此我想確保volume-的期望輸出id始終采用以下格式:sdb,sdc,sdd(如果可能)。
在嘗試了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,我相信這是最新的。
以下適用於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'
如果您使用的是實施test
過濾器的最新版本,則可以執行以下操作:
.. | select(.DeviceName? | test("/dev/sd[bcd]")) | .Ebs.VolumeId
否則,您必須進行一些調整:
.. | select(.DeviceName? == ("/dev/sdb","/dev/sdc","/dev/sdd")) | .Ebs.VolumeId
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.