Разница времени между двумя строками файла журнала - PullRequest
2 голосов
/ 23 декабря 2011

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

Файлы журналов выглядят следующим образом:

~
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 / bin / 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

Ответы [ 4 ]

3 голосов
/ 23 декабря 2011

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

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

$CurrentLine = $line;
#Parse time from $CurrentLine
#Parse time from $LastLine
#Calculate difference of time
$LastLine = $line;
2 голосов
/ 23 декабря 2011

Как уже упоминалось, просто сохраните предыдущее время для справки. Вот быстрый пример использования 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
0 голосов
/ 23 декабря 2011

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

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(), и вы должны быть установлены)

0 голосов
/ 23 декабря 2011
grep -B1 gets the previous line before the line that is currently matched
...