0

vim-cmd vmsvc/getallvms像这样打印:

id  virtual machine name
11  VirtualMachine1
15  Virtual Machine 1
6   Virtu al Machin e 1


9   Virtual Machine one
21  VirtualMa chineone

我使用以下方法获取 ID:

vm_ids=$(vim-cmd vmsvc/getallvms | awk 'NR>1 {print $1}' | egrep "[0-9]+")

接下来我想遍历它们并对每个命令执行一个命令,所以我这样做:

i=2
for id in $vm_ids
do
   vm_name=$(vim-cmd vmsvc/getallvms | awk -v i=$i -F "[[:space:]]{2,}+" 'NR==i {print $2}' | egrep "$[[:alnum:]]")
   echo "Doing something to ID: $id for machine: $vm_name"
   $((i++))
done

当我的脚本null到达那些空行时,它会返回一个值。

我制作这样的虚拟机名称只是为了演示可以返回名称的各种方式。由于尚未tr安装 ESXi,我如何从输出中删除这些行,或者有更好的方法吗?

4

3 回答 3

4

grep

grep . file

awk

awk 'NF' file

但是,您可以通过一次调用来替换您的命令awk

vm_ids=$(vim-cmd vmsvc/getallvms | awk '/^[0-9]+/{print $1}')
于 2013-08-27T12:07:44.847 回答
3

使用sed

sed '/^$/d' inputfile

由于您已经将输出通过管道传输到 awk,因此更好的方法是将您的命令替换为:

vm_ids=$(vim-cmd vmsvc/getallvms | awk 'NF && NR>1 {print $1}' | egrep "[0-9]+")
于 2013-08-27T12:06:55.897 回答
2

在 vim 中,执行以下命令:

:v/./d

编辑

使用 grep:grep -o '^[0-9]\+'应该可以工作而不必担心空行。它给出了所有前导数字(id)。

用你的命令:

vm_ids=$(vim-cmd vmsvc/getallvms|grep -o '^[0-9]\+')
于 2013-08-27T12:08:28.393 回答