2010-11-09 5 views
0

Я пытаюсь создать скрипт, который будет выводить данные из системной команды, и я хочу организовать данные в массив.Сборка массива с вывода

Сценарий заключается в обнаружении виртуальных машин, находящихся на локальном сервере ESXi, который у меня есть. Я использую plink.exe для отправки команды на сервер, а затем возвращает список виртуальных машин, который выглядит так.

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"); 

Любое понимание было бы замечательным.

ответ

1

Да, используйте backquotes не 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; 
} 
+0

Я убегал от них, потому что он продолжал кричать на меня. Я говорил, что это был оператор, а @ рассматривался как массив. – ianc1215

+0

Это именно то, что мне нужно! И забавный небольшой побочный эффект [0] - это заголовки различных столбцов, которые я собирался пропустить, так что это победа. – ianc1215

1

Если ни один из столбцов данных не содержит пробелов, вы можете легко сделать вывод в строки, перебрать их и split(/\s+/) строки в массивы. Затем извлеките интересующие колонки, по индексу.

+0

Вы имеете в виду пустые горизонтальные линии между каждым результатом? – ianc1215

+0

Нет, я имею в виду, что сами поля данных не могут содержать пробелы, или функция split (/ \ s + /) возвращает два отдельных поля для таких данных. Например, последняя строка будет анализироваться как ('240', 'WS01', '[datastore2]', 'WS01/WS01.vmx', 'ubuntu64Guest', 'vmx-07'). Если в «WS01/WS01.vmx» было место, которое дало бы два поля, в результате получилось бы 7 полей вместо 6. Для пустых строк вы можете просто проверить, имеет ли массив, возвращаемый split (/ \ s + /), достаточно элементов - если нет, пропустите его. – cdhowie

+0

Это прекрасно. После того, как я получу основы всего, я захочу объединить [datastore] и server/server.vmx в /datastore/server/server.vmx, чтобы отразить его путь в системе. Но это время, когда я действительно понимаю регулярное выражение. – ianc1215

Смежные вопросы