从输出构建数组

时间:2010-11-09 20:57:48

标签: perl scripting vmware

我正在尝试创建一个脚本,它将输出系统命令,我想将数据组织成一个数组。

该脚本用于发现驻留在我所拥有的本地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");

任何见解都会很棒。

2 个答案:

答案 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;
}