2011-12-23 3 views
2

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

лог-файл следующим образом:

~ 
Other Stuff 
~ 
12/21/11 18:58:15 Inserting data into ST_ITEMS 
ST_ITEMS Row: 10000 inserted at 12/21/11 19:40:06 
ST_ITEMS Row: 20000 inserted at 12/21/11 20:05:58 
ST_ITEMS Row: 30000 inserted at 12/21/11 20:37:03 
ST_ITEMS Row: 40000 inserted at 12/21/11 20:59:25 
ST_ITEMS Row: 50000 inserted at 12/21/11 21:17:43 
ST_ITEMS Row: 60000 inserted at 12/21/11 21:54:47 
12/21/11 21:59:24 Finished inserting data into Staging Tables 

~ 
Other Stuff 
~ 

12/21/11 22:04:43 Inserting data into ST_ITEMS 
ST_ITEMS Row: 10000 inserted at 12/21/11 22:38:53 
ST_ITEMS Row: 20000 inserted at 12/21/11 23:06:33 
ST_ITEMS Row: 30000 inserted at 12/21/11 23:33:03 
ST_ITEMS Row: 40000 inserted at 12/22/11 00:05:38 
ST_ITEMS Row: 50000 inserted at 12/22/11 00:45:59 
ST_ITEMS Row: 60000 inserted at 12/22/11 01:12:42 
ST_ITEMS Row: 70000 inserted at 12/22/11 01:40:02 
ST_ITEMS Row: 80000 inserted at 12/22/11 02:14:23 
ST_ITEMS Row: 90000 inserted at 12/22/11 03:04:15 
ST_ITEMS Row: 100000 inserted at 12/22/11 03:47:13 
ST_ITEMS Row: 110000 inserted at 12/22/11 04:36:21 
ST_ITEMS Row: 120000 inserted at 12/22/11 05:44:47 
ST_ITEMS Row: 130000 inserted at 12/22/11 06:28:24 
ST_ITEMS Row: 140000 inserted at 12/22/11 07:10:55 
ST_ITEMS Row: 150000 inserted at 12/22/11 07:35:16 
12/22/11 07:40:28 Finished inserting data into Staging Tables 

~ 
Other Stuff 
~ 

По сути, я хочу, чтобы вычислить, как долго каждые 10000 строк принимают путем вычитания даты/времени строки из одного над ним. Я рассматриваю как Perl, так и Bash как опции, но кажется, что Perl предлагает больше возможностей.

PERL #!/USR/бен/Perl

use strict; 
use warnings; 

use Date::Parse; 
use Date::Format; 

my $start = "2007-11-17 12:50:22"; 
my $stop = "2007-11-17 12:53:22"; 
my $diff = str2time($stop) - str2time($start); 

#printf "diff between %s and %s is %d seconds\n", $start, $stop, $diff; 

open(LOG,"info_refresh_tvl.log.122111_185800") or die "Unable to open logfile:$!\n"; 
while(my $line = <LOG>){ 


     if ($line=~/inserted\b/) 

     { 
     #Pseudocode 
      #Parse time from Pervious Line 
      #Parse time from Current Line 
      #Calculate Difference of Time 
        #my $diff = str2time($stop) - str2time($start); 
      #printf "diff between %s and %s is %d seconds\n", $start, $stop,  $diff; ') 

      printf $line ; 


     } 

} 
close(LOG); 

BASH

grep 'ST_ITEMS Row:' logfile122111.log | while read line 
    do 
     event=$(echo "$line" | awk '{print $6 " " $7}') 

     case $event in 
      "10000") 
       ;; 
      *) 
       past=$(echo "$line" | awk '{print $6 " " $7}') 
       current=$(echo "$line" | awk '{print $6 " " $7}' 
       echo $past 
       echo $current) 
       ;; 
     esac 



echo $event 


    done 
+0

Я рассматриваю положить информацию в массив раза, а затем разборе раз из массива и вычитание , в то время как (мой $ строка = ) { если ($ строка = ~/вставить \ б /) { толчок (@times, $ линия); } печать "@times"; } закрыть (LOG); – user739866

ответ

3

Просто сохраните каждую строку, когда вы по-прежнему после сравнения. Перезапустите его с текущей строкой после того, как закончите.

В псевдокоде:

$CurrentLine = $line; 
#Parse time from $CurrentLine 
#Parse time from $LastLine 
#Calculate difference of time 
$LastLine = $line; 
0
grep -B1 gets the previous line before the line that is currently matched 
0

Вы можете определить две переменные для хранения времени. В псевдокоде, который дал бы:

my $old = undef; 
my $current; 

while (my $line = <LOG>) { 
    $line =~ /inserted at (.*)/ or next; 
    $current = parse_time($1); 
    if (defined $old) { 
     printf("Time to insert 10k rows: %d\n", datediff($current, $old)); 
    } 
    $old = $current; 
} 

(заполнить пробелы для parse_time() и datediff() и вы должны быть установлены)

2

Как другие уже упоминалось, просто держать предыдущий раз для справки. Вот простой пример использование Time::Piece, который является основным модулем, так как Perl 5.10:

use Time::Piece; 

my $lasttime; 
while(<DATA>) { 
    chomp; 

    my $diff; 
    if(m{(\d+/\d+/\d+ \d+:\d+:\d+)}) { 
     my $t = Time::Piece->strptime($1, "%D %H:%M:%S"); 
     if(defined $lasttime) { 
      $diff = $t - $lasttime; 
     } 
     $lasttime = $t; 
    } 
    undef $lasttime if m{Finished inserting data}; 

    print "$_\t", ($diff && $diff->pretty) , "\n"; 
} 

__DATA__ 
~ 
Other Stuff 
~ 
12/21/11 18:58:15 Inserting data into ST_ITEMS 
ST_ITEMS Row: 10000 inserted at 12/21/11 19:40:06 
ST_ITEMS Row: 20000 inserted at 12/21/11 20:05:58 
ST_ITEMS Row: 30000 inserted at 12/21/11 20:37:03 
ST_ITEMS Row: 40000 inserted at 12/21/11 20:59:25 
... 

гравюры

~ 
Other Stuff 
~ 
12/21/11 18:58:15 Inserting data into ST_ITEMS 
ST_ITEMS Row: 10000 inserted at 12/21/11 19:40:06 41 minutes, 51 seconds 
ST_ITEMS Row: 20000 inserted at 12/21/11 20:05:58 25 minutes, 52 seconds 
ST_ITEMS Row: 30000 inserted at 12/21/11 20:37:03 31 minutes, 5 seconds 
ST_ITEMS Row: 40000 inserted at 12/21/11 20:59:25 22 minutes, 22 seconds