簡體   English   中英

如何使用jq解析AWS CLI json輸出以獲取卷ID數組?

[英]How to parse AWS CLI json output using jq to get array of volume-ids?

我正在使用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

我試圖通過將aws-cli輸出傳遞給jq來使用jq進行解析,但是我不斷收到“ jq:error:Cannot index array with string”。

另外, DeviceName可能不一定總是以我可以假設數組中的第2、3rd和4th個元素的順序正確的順序出現,因此我想確保volume-的期望輸出id始終采用以下格式: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'

如果您使用的是實施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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM