【问题标题】:How to remove blank lines without using tr?如何在不使用 tr 的情况下删除空行?
【发布时间】:2013-08-30 04:02:47
【问题描述】:

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,如何从输出中删除这些行,或者有更好的方法吗?

【问题讨论】:

  • 是的,有更好的方法来做到这一点。查看您昨天得到的答案和 cmets。

标签: linux awk sh esxi


【解决方案1】:

使用sed:

sed '/^$/d' inputfile

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

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

【讨论】:

    【解决方案2】:

    grep:

    grep . file
    

    awk:

    awk 'NF' file
    

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

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

    【讨论】:

      【解决方案3】:

      在 vim 中,执行以下命令:

      :v/./d
      

      编辑

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

      用你的命令:

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

      【讨论】:

      • 你能详细说明这是做什么的以及我是如何做到的吗?
      • 按你的方式输入命令对我不起作用。如果我输入vim-cmd,我会得到以下选项hbrsvc/ internalsvc/ solo/ vmsvc/ hostsvc/ proxysvc/ vimsvc help
      • 你能简单解释一下,你为什么用'vim'标记这个问题? vim-cmd 是什么?
      • 对不起,我以为我标记的是 vim-cmdvim-cmd 是一组内置的 ESXi 实用程序。
      • @inquisitor 没关系。我添加了一个 grep 选项,应该可以满足您的要求。请给它一个测试。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多