2013-12-09 3 views
1

У меня есть файл журнала, содержащий вывод нескольких команд, запущенных на каждом сервере. Формат подобенPerl - чтение файла вывода команд по строке

APRHY01> lt all 
131119-15:41:39 10.105.219.68 10.0b stopfile=/tmp/27599 
Checking MOM version...RNC_NODE_MODEL_M_1_200 
Parsing MOM (cached): /home/ekisjay/moshell//jarxml/RNC_NODE_MODEL_M_1_200.xml.cache.gz Done. 
............. 
. 
. 
. 
APRHY01> alt 
131119-15:41:55 10.105.219.68 10.0b RNC_NODE_MODEL_M_1_200 stopfile=/tmp/27599 
Connecting to 10.105.219.68:56834 (CorbaSecurity=OFF, corba_class=2, java=1.6.0_26, jacoms=R73D19, jacorb=R73D01) 
Starting to retrieve active alarms 
Nr of active alarms are: 3 

APRHY01> strt 
131119-15:41:58 10.105.219.68 10.0b RNC_NODE_MODEL_M_1_200 stopfile=/tmp/27599 

Following 326 sites are up: 
--------------------------------------------------------------------------------------------------------------------- 
MOD IUBLINK CELLNAMES  CFRPHEM1 CFRPHEM2 CFRPHEM3 CFRPHEM4 CFRPHEM5 CFRPHEM6 ICDS TN ATMPORTS 
--------------------------------------------------------------------------------------------------------------------- 
    21 Iub_00023 UHYD494-X  111111            1 1 I 
    21 Iub_00032 UHY4100-X  111111            1 1 I 

затем на следующий сервер или узел это повторяется ...

APRHY02> lt all 

131119-15:44:51 10.105.219.4 10.0b stopfile=/tmp/2874 
Checking MOM version...RNC_NODE_MODEL_M_1_200 
Parsing MOM (cached): /home/ekisjay/moshell//jarxml/RNC_NODE_MODEL_M_1_200.xml.cache.gz Done. 
Using paramfile /home/ekisjay/moshell//commonjars/pm/PARAM_RNC_M_1_50.txt 
Parsing 
file /home/ekisjay/moshell//commonjars/pm/PARAM_RNC_M_1_50.txt ... 

Я должен взять несколько строк (в соответствии с Условия работы, которые, как утверждается в требовании) между каждая команда для каждого узла. Я написал программу perl при прочтении строки за строкой и остановился в каждой строке, соответствующей команде /[A-Z][A-Z][A-Z][A-Z][A-Z][0-9][0-9]\>, а затем извлекал необходимые строки между и до следующей командной строки и записывал их в другой файл. В цикле моя программа фактически пропускает одну команду между ними и идет для следующей команды (1-й, 3-й, 5-й тип ...). Может кто-нибудь мне помочь?

ответ

0

Вы не показали нам код, который вы используете для анализа файла, так что трудно сказать, что может быть не так с ним :-)

Для разбивки вывода нескольких строк журнала, как это, хорошим методом является прокрутка файла, добавление строк в блок текста, пока вы не найдете первую строку следующего блока - затем очистите блок, который вы добавляли, и создайте новый, начиная с текущей строки ,

my $block = ""; 
while (<>) { 
    if (/[A-Z][A-Z][A-Z][A-Z][A-Z][0-9][0-9]\>/) { 
     write_block($block) if $block; 
     $block = ""; 
    } 
    $block .= $_; 
} 
write_block($block); 
+0

код: мой $ srcFile = «new.log» мой $ DestFile = «deviations.log «my grabbed = {}; my $ line =" "; open (my $ src," $ srcFile ") или умереть" Не удалось открыть файл журнала $ srcFile: $! "; открыть (мой $ dest,"> > $ destFile ") или die" Не удалось открыть файл назначения $ destFile: $!", тогда как ($ line = <$src>) { if ($ line = ~/[AZ] [AZ] [AZ] [AZ] [AZ] [0-9] [0-9] \> /) {push grabbed , «Отклонения вывода команды: $ line \ n»; while ($ line = <$src>) {if ($ line! ~/[AZ] [AZ] [AZ] [AZ] [AZ] [0-9 ] [0-9] \> /) {push grabbed, $ line;} else {last;}}}} print $ dest "\ ngrabbed"; закрыть $ dest; закрыть $ src; –

+0

В моем коде заменить grabbed by @grabbed –

+0

_Пожалуйста, подумайте о добавлении кода в исходный вопрос, в интересах кого-либо, кто читает, кто пытается ответить. И скопируйте и вставьте именно код, с которым у вас возникли проблемы, чтобы убедиться, что проблема не (например, 'grabbed' для' $ grabbed') –

0

Возможно следующее будет полезно:

use strict; 
use warnings; 

my ($fileName, $fh, $i); 

while (<>) { 
    if (!$fileName or $fileName ne $ARGV) { 
     $fileName = $ARGV; 
     $i  = 0; 
    } 

    if (my ($cmd) = /^([A-Z]{5}\d{2}>.+)/) { 
     $cmd =~ s/\W+/_/g; 
     open $fh, '>', $cmd . '_' . (sprintf '%05d', ++$i) . '.txt' or die $!; 
    } 

    print $fh $_; 
} 

Использование командной строки: >perl script.pl logFile1 [logFile2 .. logFileN]

[ ] обозначение указывает на необязательные несколько файлов.

Сценарий использует регулярное выражение для захвата строки команды/сервера, а затем заменяет символы «не-слово» символом подчеркивания, а это плюс счетчик плюс .txt становится именем файла, на который написан этот текст команды , Таким образом, используя набор данных, следующие текстовые файлы были созданы содержимое, содержащее команду:

APRHY01_lt_all_00001.txt 
APRHY01_alt_00002.txt 
APRHY01_strt_00003.txt 
APRHY02_lt_all_00001.txt 
APRHY02_alt_00002.txt 
APRHY02_strt_00003.txt 

Отсчет был вставлен только в случае, если та же команда была выпущена более чем один раз на тот же сервер, так как это число страхует отдельные файлы каждый.

0

Ваш

код:

my $srcFile = "new.log"; 
my $destFile = "deviations.log"; 
my @grabbed = {}; 
my $line = ""; 
open (my $src, "$srcFile") or die "Could not open the log file $srcFile: $!"; 
open (my $dest, ">>$destFile") or die "Could not open the destination file $destFile: $!"; 
while ($line = <$src>) 
{ if ($line =~ /[A-Z][A-Z][A-Z][A-Z][A-Z][0-9][0-9]\>/) 
    { push @grabbed, "Deviations of the output of command: $line\n"; 
    while ($line = <$src>) 
    {if ($line !~ /[A-Z][A-Z][A-Z][A-Z][A-Z][0-9][0-9]\>/) 
    {push @grabbed, $line; 
    } 
    else 
    {last; 
} } }} 
print $dest "\[email protected]"; 
close $dest; 
close $src; 

при выполнении last на поиске новой командной строки, идет к наружному while ($line = <$src>), таким образом, уже читает следующую строку (первый выход линии команда) и не распознать начало команды. Простое исправление пропустить чтение новой строки, маркируя внешнюю петлю и с помощью redo вместо last:

LINE: 
while ($line = <$src>) 
{ if ($line =~ /[A-Z][A-Z][A-Z][A-Z][A-Z][0-9][0-9]\>/) 
    { push @grabbed, "Deviations of the output of command: $line\n"; 
    while ($line = <$src>) 
    { if ($line !~ /[A-Z][A-Z][A-Z][A-Z][A-Z][0-9][0-9]\>/) 
     { push @grabbed, $line } 
     else 
     { redo LINE } 
} } } 
Смежные вопросы