如何在不使用tr的情况下删除空行?

时间:2013-08-27 12:05:09

标签: linux awk sh esxi

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值。

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

3 个答案:

答案 0 :(得分:4)

使用grep

grep . file

使用awk

awk 'NF' file

但是,您只需拨打一次awk

即可替换您的命令
vm_ids=$(vim-cmd vmsvc/getallvms | awk '/^[0-9]+/{print $1}')

答案 1 :(得分:3)

使用sed

sed '/^$/d' inputfile

由于您已经将输出传递给awk,更好的方法是用以下命令替换命令:

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

答案 2 :(得分:2)

在vim中,执行以下命令:

:v/./d

修改

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

用你的命令:

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