使用 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
我试过在 grep
和 sed
上使用变体,但我得到关于破折号的错误。例如:
$ 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"在哪里,你可以把你的关机代码!
我正在编写一个脚本,它只会在所有 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
我试过在 grep
和 sed
上使用变体,但我得到关于破折号的错误。例如:
$ 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"在哪里,你可以把你的关机代码!