我正在尝试创建一个脚本,它将输出系统命令,我想将数据组织成一个数组。
该脚本用于发现驻留在我所拥有的本地ESXi服务器上的VM。我正在使用plink.exe将命令发送到服务器,然后它返回一个看起来像这样的VM列表。
Vmid Name File Guest OS Version Annotation 128 NS01 [datastore2] NS01/NS01.vmx ubuntu64Guest vmx-07 144 NS02 [datastore2] NS02/NS02.vmx ubuntu64Guest vmx-07 208 MX01 [datastore2] MX01/MX01.vmx ubuntu64Guest vmx-07 224 SQL01 [datastore2] SQL01/SQL01.vmx ubuntu64Guest vmx-07 240 WS01 [datastore2] WS01/WS01.vmx ubuntu64Guest vmx-07
我如何拍摄并制作阵列?唯一真正重要的列是VMID,Name,File
我用来获取输出的命令就是这个。
# Parse ESX\ESXi server for virtual machines that reside on it
system ("$plink \-batch \-pw $esx_password $esx_user\@$esx_host vim-cmdvmsvc/getallvms\n");
任何见解都会很棒。
答案 0 :(得分:1)
如果没有数据列包含空格,您可以轻松地split(/\n/)
输出为行,迭代这些行,并将split(/\s+/)
行放入数组中。然后按索引提取您感兴趣的列。
答案 1 :(得分:1)
是的,如果要解析输出,请使用反引号而不是system
。
my $cmd
= "$plink -batch -pw $esx_password $esx_user\@$esx_host "
. "vim-cmdvmsvc/getallvms"
;
my @lines = `$cmd`;
system
只会使用您的标准。
不知道为什么你要逃脱冲刺,但是......
获得输出后,您可以执行以下操作(请注意,我利用了固定长度字段的外观):
foreach ( @line ) {
# this is the get-it-and-do-something-else-with-it version
my ( $vmid, $name, $file )
= substr( $_, 0, 47 ) =~ m/^ ( \d+ ) \s+ ( \S+ ) \s+ (.*\S) \s* $/x
;
# OR the store-it-in-an-array-of-hashes version:
@{ my $h = {}}{ qw<VMID Name File> }
= substr( $_, 0, 47 ) =~ m/^ ( \d+ ) \s+ ( \S+ ) \s+ (.*\S) \s* $/x
;
push @array, $h if %$h;
}