使用 sed 从 'virsh list' 输出中删除 header

use sed to remove header from 'virsh list' output

我正在编写一个脚本,它只会在所有 VM 关闭后关闭我的服务器。我发现最可靠的方法是: ssh root@vmserver 'virsh list'

这会给我这样的东西:

 Id    Name                           State
----------------------------------------------------
 2     DNSserver                      running
 3     salt                           running
 4     logserver                      running
 5     webserver                      running
 6     mail                           running
 7     fileserver                     running

当所有虚拟机都关闭时,它只会显示:

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

所以我正在寻找一种方法让我的 bash 脚本等待列表为空,然后向服务器发出关闭命令。我不想依赖 expect,因为并非所有系统都有该命令。这是我目前所拥有的:

#!/bin/bash
# stuff to shutdown VMs here (snipped) #
output=$(ssh root@vmserver 'virsh list')
# need something here to strip out the header
[ "$output" == "" ] && shutdown -h now

我试过在 grepsed 上使用变体,但我得到关于破折号的错误。例如:

$ sed -i "Id Name State ----------------------------------------------------" $output
sed: unrecognized option '----------------------------------------------------'

grep 包含 0 个或多个空格和一个数字的行,如果不为空,则关闭:

[ -n "$(ssh root@vmserver 'virsh list' | grep -E '^\s*\d+')" ] && shutdown -h

grep 为 0 个或多个空格和一个数字的行,如果 1 个或多个行匹配,则关闭:

[ "$(ssh root@vmserver 'virsh list' | grep -E '^\s*\d+' | wc -l)" -ge 1 ] && shutdown -h

删除输出的前两行并计算它们。如果线路存在,则关闭。 我个人认为这是不安全的,因为它不可预测。无法知道前两行是什么 [ "$(ssh root@vmserver 'virsh list' | sed '1,2d' | wc -l)" -ge 1 ] && shutdown -h

我只用...

for VM in $(virsh list --state-running --name); do echo "shotdown $VM"; done

... 在 bash shell 脚本中关闭我所有的虚拟机。 "echo"在哪里,你可以把你的关机代码!