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
的值时漏掉了一对括号。
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
的值时漏掉了一对括号。