使用sed从' virsh列表中删除标题'产量

时间:2015-09-20 02:46:48

标签: bash sed scripting

我正在编写一个脚本,只有在关闭所有虚拟机后才会关闭我的服务器。我发现这样做最可靠的方法是:   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脚本等到列表为空,然后向服务器发出shutdown命令。我并不想依赖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 '----------------------------------------------------'

2 个答案:

答案 0 :(得分:3)

我只使用......

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

...在bash shell脚本中关闭所有我的vms。 “echo”的位置,你可以把你的关机代码!

答案 1 :(得分:1)

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