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