2013-08-27 24 views
0

vim-cmd vmsvc/getallvms打印这样的:如何删除空行而不使用tr?

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值whe它到达那些空行。

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

+0

是有这样做的更好的方法。查看你昨天得到的答案和评论。 –

回答

2
在vim

,执行此命令:

:v/./d 

编辑

与grep:grep -o '^[0-9]\+'应该工作而不用担心空行。它提供了所有的主要数字(ID)。

与您的命令:

vm_ids=$(vim-cmd vmsvc/getallvms|grep -o '^[0-9]\+') 
+0

你能详细说明这是干什么的吗?我该怎么做呢? –

+0

这是一个vim命令,你可以在vim中执行它。 – Kent

+0

按照你的方式输入命令对我来说不起作用。如果我输入'vim-cmd',我会得到以下选项:'hbrsvc/internalsvc/solo/vmsvc/hostsvc/proxysvc/vimsvc help' –

3

使用sed

sed '/^$/d' inputfile 

既然你已经管道输出到awk中,一个更好的办法是,以取代您的命令:

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

随着grep

grep . file 

With awk

awk 'NF' file 

但是你可以用一个调用替换您的命令awk

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