virsh 获取阵列中所有虚拟机的磁盘位置

virsh get disk location of all VMs in a Array

for i in $(virsh list --all | awk '{print }'|grep -v Name);
  do
    virsh domblklist $i --details | awk '{print }'|grep -v Source;
  done

我明白了

/sdc/kvm_strage/vm1.qcow2
/sdc/kvm_strage/vm1_1.qcow2
-


/sdc/kvm_strage/vm2.qcow2
-


/sdc/kvm_strage/vm3.qcow2
/sdc/kvm_strage/vm3_1.qcow2
-

但我想获取数组中的路径并排除 "-" 之类的

my_array=(/sdc/kvm_strage/vm1.qcow2 /sdc/kvm_strage/vm1_1.qcow2 /sdc/kvm_strage/vm2.qcow2 /sdc/kvm_strage/vm3.qcow2 /sdc/kvm_strage/vm3_1.qcow2)

怎么做?

您可以使用 tail --lines=+3 跳过 2 header 行,以避免捕获列标题和虚线分隔符 header。

这是 virsh list --all 的样子:

2 header 行跳过 tail --lines=+3:

 Id    Name                           State
----------------------------------------------------

要解析的数据:

 1     openbsd62                      running
 2     freebsd11-nixcraft             running
 3     fedora28-nixcraft              running

跳过域列表的 header 行后,下面的脚本在 while read 循环中遍历每个域 从 virsh list --all | tail --lines=+3 | awk '{print }' 接收数据

然后在 while 循环内,它将 virsh domblklist "$domain" --details | tail --lines=+3 | awk '{print }' 的输出映射到临时 file-mapped 数组 MAPFILE;
并将 MAPFILE 数组条目添加到 my_array

执行后,my_array包含所有域的所有块设备。

#!/usr/bin/env bash

declare -a my_array=() # array of all block devices

# Iterate over domains that are read from the virsh list
while IFS= read -r domain; do
  mapfile < <( # capture devices list of domain into MAPFILE
    # Get block devices list of domain
    virsh domblklist "$domain" --details |

      # Start line 3 (skip 2 header lines)
      tail --lines=+3 |

        # Get field 4 s value
        awk '{print }'
  )
  my_array+=( "${MAPFILE[@]}" ) # Add the block devices paths list to my_array
done < <( # Inject list of domains to the while read loop
  # List all domains
  virsh list --all --name
)

这是另一种方法:

declare -a my_array=($(for vm in $(virsh list --all --name); do
    virsh domblklist $vm --details | awk '/disk/{print }'
done))

编辑:我刚刚注意到我在设置 my_array 的值时漏掉了一对括号。