2014-02-03 2 views
0

Файл структурирован следующим образом:Perl Как найти определенную начальную и конечную строки из файла журнала?

<28 Jan 2014 00:08:24>00001 startmessage1 
<28 Jan 2014 00:08:24>00001 msg1 
<28 Jan 2014 00:08:24>00001 msg1 
<28 Jan 2014 00:08:24>00001 startmessage2 
<28 Jan 2014 00:08:25>00001 msg2 
<28 Jan 2014 00:08:25>00001 msg2 
<28 Jan 2014 00:08:25>00001 msg2 
<28 Jan 2014 00:08:25>00001 msg2 
<28 Jan 2014 00:08:25>00001 msg2 
<28 Jan 2014 00:08:26>00001 msg2 
<28 Jan 2014 00:08:26>00001 Endmessage2 
<28 Jan 2014 00:08:26>00001 msg1 
<28 Jan 2014 00:08:26>00001 msg1 
<28 Jan 2014 00:08:27>00001 startmessage3 
<28 Jan 2014 00:08:27>00001 msg3 
<28 Jan 2014 00:08:28>00001 msg1 
<28 Jan 2014 00:08:28>00001 msg1 
<28 Jan 2014 00:08:30>00001 Endmessage1 
<28 Jan 2014 00:08:31>00001 msg3 
<28 Jan 2014 00:08:31>00001 msg3 
<28 Jan 2014 00:08:31>00001 msg3 
<28 Jan 2014 00:08:31>00001 Endmessage3 

Дата и время, ID, сообщения журнала ... должен найти сообщение о начале и соответствующее закрывающем сообщение для culculate сроки.

выход должен быть

28 Jan 2014 00:08:24 |startmessage1 |Endmessage1 |00001| 6 seconds 
28 Jan 2014 00:08:24 |startmessage2 |Endmessage2 |00001| 2 seconds 

Мой код:.

my @startmsg= ("startmessage1","startmessage2","startmessage3"); 
my @endmsg= ("Endmessage1","Endmessage2","Endmessage3"); 
print 'THREAD ID,LOG DETAILS'."\n"; 

    foreach my $filename (glob("$dir/*.out")) 
     { 
      open(my $fh, "<", $filename) or die "Could not open '$filename'\n"; 

       while ($line = <$fh>) 
       { 
         my $i=2; 
         chomp($line); 

         if($line=~ $startmsg[$i]) 
         { 
           chomp ($line); 
           my $threadid=$line; 
           $threadid =~ s!(\d*)\s*.*!$1!; 
           my $startdetails=$line; 
           $startdetails =~ s!(\d*)\s*(.*)!$2!; 
           chomp($threadid); 
           print "$threadid,$startdetails \n"; 
           my $flag = 'False'; 

           OUTER: while ($line = <$fh>) 
           { 
             if ($line=~ m/$threadid/) 
             if($line=~ $endmsg[$i]) 
               { 
               chomp ($line); 
               my $enddetails=$line; 
               $enddetails =~ s!(\d*)\s*(.*)!$2!; 
               print "$threadid,$enddetails\n"; 
               $flag='True'; 
               last OUTER; 
               } 

             } 
           } 
         } 

       } 
       close($fh); 
     } 

«Im в состоянии получить только один старт и конец сообщения в этой программе также я попытался с назначением все уставившись в одну переменную (все начальные сообщения в одной переменной и все конечные сообщения в одной переменной) .. проблема возникает после сообщения начала1, окончательное сообщение 2 получено и рассчитано неверная разница во времени. помогите мне исправить проблему «

Примечание. Начальные сообщения и конечные сообщения различны. Я просто привел примеры. Кроме того, в той же строке, что я выскабливание несколько вещей

Пожалуйста, помогите мне

+0

Вы должны указать, что проблема с вашим кодом ... – MarcoS

+0

я добавил свои проблемы. Спасибо – user3265858

ответ

1

Использование DateTime для обработки обработки даты и времени. Сохранение сообщений в хеш:

#!/usr/bin/perl 
use warnings; 
use strict; 
use feature qw{ say }; 

use DateTime; 

my %message; 

sub month2num { 
    my $name = shift; 
    my %months; 
    @months{ qw(Jan Feb Mar Apr May Jun Jul Aug Sep Nov Oct Nov Dec) } = (1 .. 12); 
    return $months{$name} 
} 


while (<>) { 
    if (my ($timestamp, $num, $type, $msg) 
      = /^ <(.*)> ([0-9]+)\ (start|End) message ([0-9]+) $/x) { 
     my ($day, $month, $year, $hour, $minute, $second) = split /[ :]/, $timestamp; 
     my $dt = 'DateTime'->new(
       year => $year, 
       month => month2num($month), 
       day => $day, 
       hour => $hour, 
       minute => $minute, 
       second => $second, 
      ); 

     if ('start' eq $type) { 
      die "Invalid start of $msg\n" if exists $message{$msg}; 
      $message{$msg} = { start => $dt, num => $num }; 

     } else { 
      die "Invalid end of $msg\n" unless exists $message{$msg}; 
      my $duration = $dt->epoch - $message{$msg}{start}->epoch; 
      say join ' | ', $message{$msg}{start}, 
          "startmessage$msg", 
          "Endmessage$msg", 
          $message{$msg}{num}, 
          "$duration seconds"; 
      delete $message{$msg}; 
     } 
    } 
} 
+0

Спасибо за ваш ответ ... Извините ... Сообщение о запуске и конец сообщения разные. Я просто привел примеры. Также в той же строке я пробираю еще несколько вещей. – user3265858

+0

@ user3265858: Основная идея должна быть одинаковой. Не стесняйтесь модифицировать код в соответствии с вашими потребностями. – choroba

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