您可以使用 , 跳过 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 read
从virsh 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
)