0
for i in $(virsh list --all | awk '{print $2}'|grep -v Name);
  do
    virsh domblklist $i --details | awk '{print $4}'|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)

怎么做?

4

2 回答 2

1

这是另一种方法:

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

编辑:我刚刚注意到在设置my_array.

于 2019-09-07T00:35:00.400 回答
0

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

这是一个virsh list --all样子:

2个标题行跳过tail --lines=+3

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

要解析的数据:

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

在它跳过域列表的标题行之后,下面的脚本在循环中迭代每个域,while readvirsh list --all | tail --lines=+3 | awk '{print $2}'

然后在 while 循环中,它将 的输出virsh domblklist "$domain" --details | tail --lines=+3 | awk '{print $4}'映射到临时文件映射数组中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 $4}'
  )
  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
)
于 2019-09-07T00:01:18.037 回答