[Loganalizer] парсер

Koshelev Dmitry koshelev@ccfit.nsu.ru
Thu, 20 May 2004 10:11:54 +0700


--Boundary-00=_6HCrA60zDbr3OA/
Content-Type: text/plain;
  charset="koi8-r"
Content-Transfer-Encoding: base64
Content-Disposition: inline

18/UINDB0tPF0grOycvBy8nIIMTB1CDOxSDX09TSxdTJzArP1MvS2dfBzCBrc3ByZWFkJ8/NICjc
y9fJ18HMxc7UIGV4ZWwg1yBrZGUpCtPExczBzCDSwdrCycXOycUgy8/Mz87PyyDUydDBIDEyMy8x
MjMgzsEgxNfFICh1cCDJIGRvd24pIMkgydPQ0sHXycwgy8/FLd7UzwrJzMkgztXWzs8gwtnMzyDL
z8zPzsvJINDF0sXJzcXOz9fZ18HU2CDQzyDTzdnTzNUgPwoK18/Q0s/T2SA6CtTF0MXS2CDNzsUg
ztXWzs8gzsHQydPB1Ngg0NLP18XSy9Ug0NLJzsHEzMXWzs/T1Mkg19nCz9LLySDOz9LNwczYzs/N
1SDSwdPQ0sXExczFzsnACtDPIMvSydTF0snAINPU2MDExc7UwSA/CtPeydTB0SDX2cLP0s/eztnF
IMTJ09DF0tPJwCDJINPSxcTOxcUKCsjJIMvXwcTSwdQgySDT1NjAxMXO1MEg3NTPIM7FIM/Ezs8g
ySDUzyDWxQrIySDL18HE0sHUINzUzyDL0snUxdLJyiDQydLTz87BICjVIM3FztEg1yDMxcvDydHI
KQo=

--Boundary-00=_6HCrA60zDbr3OA/
Content-Type: text/x-perl;
  charset="koi8-r";
  name="parser.pl"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
	filename="parser.pl"

#!/usr/bin/perl

@starttime = (0 , 0);
$startday = 0;
@endtime = (24 , 0);
$endday = 0;
$b = 1;
$t = 1;
$sar = "0";

for($i = 0 ; $i <= $#ARGV ; $i++) {
    if( $ARGV[$i] eq "-starttime" ) {
	if( $i < $#ARGV &&  $ARGV[$i+1] =~ /^(\d{1,2}?):(\d{1,2}?)$/ && $1 < 24 && $2 < 60 ) {
	    $starttime[0] = $1;
	    $starttime[1] = $2;
	}
	else {
	    print "usage: -starttime HH:mm\n";
	    exit(1);
	}
    }

    if( $ARGV[$i] eq "-endtime" ) {
	if( $i < $#ARGV &&  $ARGV[$i+1] =~ /^(\d{1,2}?):(\d{1,2}?)$/ && $1 < 24 && $2 < 60 ) {
	    $endtime[0] = $1;
	    $endtime[1] = $2;
	}
	else {
	    print "usage: -endtime HH:mm\n";
	    exit(1);
	}
    }



    if( $ARGV[$i] eq "-days" ) {
	if( $i < $#ARGV && $ARGV[$i + 1] =~ /^(\d{1,2}?)-(\d{1,2}?)$/ && 0 < $1 && 
$2 <= 31 && $1 < $2 && $startday == 0 && $endday == 0) {
	    $startday = $1;
	    $endday = $2;
	}
	else {
	    print "usage WITHOUT -day: -days DD|D-DD|D\n";
	    exit(1);
	}
    }

    if( $ARGV[$i] eq "-day" ) {
        if( $i < $#ARGV && $ARGV[$i + 1] =~ /^(\d{1,2}?)$/ && 0 < $1  && $1 <= 31 &&
$startday == 0 && $endday == 0) {
            $startday = $1;
            $endday = $1;
        }
        else {
            print "usage WITHOUT -days: -day DD|D\n";
            exit(1);
        }
    }


    if( $ARGV[$i] eq "-b" ) {
	$b = 0;
    }

    if( $ARGV[$i] eq "-t") {
	$t = 0;
    }
    
    if( $ARGV[$i] eq "-help" ) {
	print "usage: parser.pl [-b] [-t] [-starttime HH:mm:ss] [-endtime HH:mm:ss]";
	print "[-days DD|D-DD|D] [-day DD]\n";
	print "-b - do NOT translate gigo-,mego-,kilo-bytes in bytes\n";
	print "-t - do NOT translate HH:mm in minutes from 00:00:00\n";
	print "-starttime HH:mm - start time for start day, default 00:00:00\n";
	print "-endtime HH:mm - end time for end day, default 24:00:00 or current time\n";
	print "-days DD|D-DD|D - days for collect stats, default current day, use without -day\n";
	print "-day DD|D - day for collect stats, default current day, use without -days\n";
	print "-help - help\n";
	exit 1;
    }
}

######################
#  get sar's output  #
######################
@opt = (0);
if($startday == 0 && $endday == 0) {
    $opt[0] = "-s $starttime[0]:$starttime[1] -e $endtime[0]:$endtime[1]";
}
elsif($startday == $endday && $startday != 0) {
    $opt[0] = "-n $startday -s $starttime[0]:$starttime[1] -e $endtime[0]:$endtime[1]";
}
else {
    $opt[0] = "-n $startday -s $starttime[0]:$starttime[1]";
    for($i = $startday+1 ; $i < $endday ; $i++) {
	$opt[$i - $startday] = "-n $i";
    }
    $opt[$i-$startday] = "-n $endday -e $endtime[0]:$endtime[1]";
}

$outsar[1][1];
for($i = 0 ; $i <= $#opt ; $i++) {
    $sar = "sar -A $opt[$i]";
    $outsar[$i] = [`$sar`];
}




###########################
#    edit sar's output    #
###########################
for($m = 0 ; $m <= $#outsar; $m++) {
    $outsar[$m][3] =~ s/^\d{2}?:\d{2}?:\d{2}?/    Time/;
}

for($m = 0 ; $m <= $#outsar ; $m++) {
    for($i = 0 ; $i <= $#{$outsar[$m]} ; $i++) {
	$outsar[$m][$i] =~ s/(.*)file-sz    (.*)/$1      file-sz $2/;
	$outsar[$m][$i] =~ s/(.*)device            (.*)/$1           device $2/;
	if( $outsar[$m][$i] =~ /.*not supported.*/ ) {
	    $outsar[$m][$i] = "\n";
	    $outsar[$m][$i - 1] = "\n";
	}
	$outsar[$m][$i] =~ s/.*linux restarts.*/\n/;
    }
    $outsar[$m][1] = "\n";
}
for($m = 0 ; $m <= $#outsar ; $m++) {
    for($i = 0 ; $i <= $#{$outsar[$m]} ; $i++) {
	if( $outsar[$m][$i] eq "\n" ) {
	    for($k = $i+1 ; $k <= $#{$outsar[$m]} && $outsar[$m][$k] eq "\n" ; $k++) {}
	    for($l = $k ; $l <= $#{$outsar[$m]} && $outsar[$m][$l] ne "\n"; $l++) {
		$outsar[$m][$i + $l - $k] = $outsar[$m][$l];
	    }
	    for($j = 1 ; $j <= $k - $i ; $j++) {
		$outsar[$m][$l - $j] = "\n";
	    }
	}
    }
}
for($m = 0 ; $m <= $#outsar ; $m++) {
    for(;$outsar[$m][$#{$outsar[$m]}] eq "\n";) {$#{$outsar[$m]}--;}
}






##################################
#             labels             #
##################################
for($m = 0 ; $m <= $#outsar ; $m++) {
    for($i = 0 ; $i < $#{$outsar[$m]} ; $i++) {
	if( $outsar[$m][$i] =~ /.*_.*_.*/ ) {
	    $outsar[$m][$i] =~ s/(\w+) /$1;/g;
	    $k = 0;
	    @labels = (0);
	    for($l = 0 ; $l == 0 || $labels[$l-1] >= $k ; $l++) {
		if( $l == 0 ) {$k = 0;}
		else {$k = $labels[$l-1] + 1;}
		$labels[$l] = index $outsar[$m][$i] , ";" , $k;
	    }
	    $#labels--;

	    for($k = $i+1 ; $k <= $#{$outsar[$m]} && $outsar[$m][$k] !~ /.*_.*_.*/ ; $k++) {
		@outsplit = split // , $outsar[$m][$k];
		for($j = 0 ; $j <= $#labels ; $j++) {
		    $outsplit[$labels[$j]] = ";";
		}
		if($outsplit[$#outsplit] ne "\n") {$outsplit[$#outsplit + 1] = "\n";}
		for($j = 0 ; $j < $#{$outsplit[$m]} ; $j++) {
		    if($outsplit[$j] eq "\n") {$outsplit[$j] = "";}
		}
		$outsar[$m][$k] = join "" , @outsplit;
	    }
	    $i = $k-1;
	}
    }
}


#################################
#          alloutsplit          #
#################################
$alloutsplit[1][1][1];

for($m = 0 ; $m <= $#outsar ; $m++) {
    for($i = 0 ; $i <= $#{$outsar[$m]} ; $i++) {
	$alloutsplit[$m][$i] = [split /;/ , $outsar[$m][$i]];
    }
}
for($m = 0 ; $m <= $#alloutsplit ; $m++) {
    for($i = 0 ; $i <= $#{$alloutsplit[$m]} ; $i++) {
        for($j = 0 ; $j <= $#{$alloutsplit[$m][$i]} ; $j++) {
	    $alloutsplit[$m][$i][$j] =~ s/\s//g;
        }
    }
}



################################
#              header          #
################################
for($m = 0 ; $m <= $#alloutsplit ; $m++) {
    for($i = 0 ; $i < $#{$alloutsplit[$m]} ; $i++) {
	######### search interval #########
	for($j = 0 ; $j <= $#{$alloutsplit[$m][$i]} &&
	    $alloutsplit[$m][$i][$j] !~ /_.*_/ ; $j++) {}

	################################
        #          new interval        #
        ################################
	if( $j <= $#{$alloutsplit[$m][$i]} ) {
	    ######## search for end interval ########
	    for($k = $i+1 ; $k <= $#{$alloutsplit[$m]} ; $k++) {
		for($l = 0 ; $l <= $#{$alloutsplit[$m][$k]} &&
		    $alloutsplit[$m][$k][$l] !~ /_.*_/; $l++) {}
		if($l <= $#{$alloutsplit[$m][$k]}) {
		    $endinterval = $k-1;
		    $k = $#{$alloutsplit[$m]}+1;
		}
	    }
	    if($k == $#{$alloutsplit[$m]} + 1) {$endinterval = $k-1;}

	    ####### search for empty time ######
	    for($a = $i+1 ; $a <= $endinterval && $alloutsplit[$m][$a][0] ne "" ; $a++) {}

	    ###### if found empty time #######
	    if($a <= $endinterval) {
		###### search for max devices ######
		$max = 0;$index = 0;
		for($k = $i + 1 ; $k <= $endinterval ; $k++) {
		    if($alloutsplit[$m][$k][0] ne "") {
			for($l = $k + 1 ; $l <= $endinterval &&
			    $alloutsplit[$m][$l][0] eq "" ; $l++) {}
			if($l - $k > $max) {
			    $max = $l - $k;
			    $index = $k;
			}
		    }
		    $k = $l - 1;
		}
		##### identify devices #####
		for($l = 0 ; $l <= $#{$alloutsplit[$m][$i + 1]} &&
		    $alloutsplit[$m][$i + 1][$l] !~ /[a-zA-Z]/; $l++) {}
		$indexdevice = $l;
		##### making @device #####
		@device = ();
		for($l = $index ; $l < $index + $max ; $l++) {
		    $device[$l - $index] = $alloutsplit[$m][$l][$indexdevice];
		}
		###### header to 1-st header ######
		if($i == 0) {
		    $allout[$m][0][$#{$allout[$m][0]} + 1] = $alloutsplit[$m][$i][0];
		}
		for($h = 0 ; $h <= $#device ; $h++) {
		    for($l = 1 ; $l < $indexdevice ; $l++) {
			$allout[$m][0][$#{$allout[$m][0]} + 1] =
			    $device[$h].":".$alloutsplit[$m][$i][$l];
                    }
		    for($l = $indexdevice + 1 ; $l <= $#{$alloutsplit[$m][$i]} ; $l++) {
			$allout[$m][0][$#{$allout[$m][0]} + 1] =
			    $device[$h].":".$alloutsplit[$m][$i][$l];
		    }
		}

		##### this interval to 1-st interval #####
		for($k = $i + 1 ; $k <= $endinterval ; $k++) {
		    if($alloutsplit[$m][$k][0] ne "") {
			###### search end sub-interval ######
			for($n = $k + 1; $n <= $endinterval &&
			    $alloutsplit[$m][$n][0] eq "" ; $n++) {}
			$endsubinterval = $n - 1;
                        ###### search index sub-interval ######
                        $indexsubinterval = 0;
                        for($n = $i + 1 ; $n <= $k ; $n++) {
			    if($alloutsplit[$m][$n][0] ne "") {$indexsubinterval++;}
			}
			###### this sub-interval to 1-st interval ######
			$d = 0;
			for($h = $k ; $d <= $#device ; $h++) {
			    if($device[$d] ne $alloutsplit[$m][$h][$indexdevice] || $h > $endsubinterval) {
				if($i == 0 && $k == $h) {
				    $allout[$m][$indexsubinterval][$#{$allout[$m][$indexsubinterval]} + 1] = $alloutsplit[$m][$h][0];
				}
				for($l = 1 ; $l < $#{$alloutsplit[$m][$i]} ; $l++) {
				    $allout[$m][$indexsubinterval][$#{$allout[$m][$indexsubinterval]} + 1] = "";
				}
				$d++;
				$h--;
			    }
			    else {
				if($i == 0 && $k == $h) {
                                    $allout[$m][$indexsubinterval][$#{$allout[$m][$indexsubinterval]} + 1] = $alloutsplit[$m][$h][0];
                                }

				for($l = 1 ; $l < $indexdevice ; $l++) {
				    $allout[$m][$indexsubinterval][$#{$allout[$m][$indexsubinterval]} + 1] = $alloutsplit[$m][$h][$l];
				}
				for($l = $indexdevice + 1 ;$l <= $#{$alloutsplit[$m][$i]} ; $l++) {
				    $allout[$m][$indexsubinterval][$#{$allout[$m][$indexsubinterval]} + 1] = $alloutsplit[$m][$h][$l];
                                }
				$d++;
			    }
			}
			###### end this interval to 1-st interval ######
		    }
		    if($k < $endsubinterval) {$k = $endsubinterval;}
		}
	    }
	    ####### else if not found empty time #######
	    else {
		######## this unterval to 1-st interval #########
		for($k = $i ; $k <= $endinterval ; $k++) {
		    if($i == 0 ) {
			$allout[$m][$k-$i][$#{$allout[$m][$k-$i]} + 1] = $alloutsplit[$m][$k][0];
		    }
		    for($l = 1 ; $l <= $#{$alloutsplit[$m][$i]} ; $l++) {
			$allout[$m][$k - $i][$#{$allout[$m][$k-$i]} + 1] = $alloutsplit[$m][$k][$l];
		    }
		}
		######## end this interval to 1-st interval ########
	    }
	    if($i > $endinterval) {$i = $endinterval;}
	}
    }
}



#####################################
#     kill not nessesary columns    #
#####################################
for($m = 0 ;$m <= $#allout ; $m++) {
    for($i = 1 ; $i <= $#{$allout[$m]} ; $i++) {
	for($j = 0 ; $j <= $#{$allout[$m][$i]} ; $j++) {
	    if($allout[$m][$i][$j] eq ""
	       || $allout[$m][0][$j] eq "cpu"
	       || $allout[$m][0][$j] eq "device"
	       || $allout[$m][0][$j] eq "port"
	       || $allout[$m][0][$j] eq "iface"
	       ) {
		for($s = 0 ; $s <= $#allout ; $s++) {
		    for($d = 0 ; $d <= $#{$allout[$s]} ; $d++) {
			for($f = $j ; $f < $#{$allout[$s][$d]} ; $f++) {
			    $allout[$s][$d][$f] = $allout[$s][$d][$f+1];
			}
			$#{$allout[$s][$d]}--;
		    }
		}
		$j--;
	    }
	}
    }
}


############################
#         doubling         #
############################
for($m = 0 ;$m <= $#allout ; $m++) {
    for($j = 0 ; $j <= $#{$allout[$m][0]} ; $j++) {
	if($allout[$m][1][$j] =~ /(.*)\/(.*)/) {
	    for($s = 0 ; $s <= $#allout ; $s++) {

		for($d = 0 ; $d <= $#{$allout[$s]} ; $d++) {
		    for($f = $#{$allout[$s][$d]}+1 ; $f > $j+1 ; $f--) {
			$allout[$s][$d][$f] = $allout[$s][$d][$f-1];
		    }
		}

		$allout[$s][0][$j+1] = $allout[$s][0][$j].":down";
		$allout[$s][0][$j] .= ":up";
                for($d = 1 ; $d <= $#{$allout[$s]} ; $d++) {
		    $allout[$s][$d][$j] =~ /(.*)\/(.*)/;
		    $allout[$s][$d][$j] = $1;
		    $allout[$s][$d][$j + 1] = $2;
                }


	    }
	    $j++;
	}
    }
}






if($b == 1) {
    for($m = 0 ; $m <= $#allout ; $m++) {
	for($i = 1 ; $i <= $#{$allout[$m]} ; $i++) {
	    for($j = 0 ; $j <= $#{$allout[$m][$i]} ; $j++) {
		if($allout[$m][$i][$j] =~ /(\d*)(\.?)(\d*)([K|M|G])/) {
		    if($4 eq "G") {
			$number = $1.$2.$3;
			$number *= 1024*1024*1024;
			$allout[$m][$i][$j] = $number;
		    }
		    if($4 eq "M") {
			$number = $1.$2.$3;
			$number *= 1024*1024;
			$allout[$m][$i][$j] = $number;
		    }
		    if($4 eq "K") {
			$number = $1.$2.$3;
			$number *= 1024;
			$allout[$m][$i][$j] = $number;
		    }
		}
	    }
	}
    }
}

if($t == 1) {
    for($m = 0 ; $m <= $#allout ; $m++) {
	for($i = 1 ; $i <= $#{$allout[$m]} ; $i++) {
	    $allout[$m][$i][0] =~ /^(\d{2}?):(\d{2}?):(\d{2}?)/;
	    $min = $1 * 60 + $2;
	    $allout[$m][$i][0] = $min;
	}
    }
}


for($m = 0 ; $m <= $#allout ; $m++) {
    for($i = 0 ; $i <= $#{$allout[$m]}; $i++) {
	for($j = 0 ; $j <= $#{$allout[$m][$i]}; $j++) {
	    if($m == 0) {
		if($j == 0) {print $allout[$m][$i][$j];}
		else {print ";",$allout[$m][$i][$j];}
	    }
	    else {
		if($i != 0) {
		    if($j == 0) {print $allout[$m][$i][$j];}
		    else {print ";",$allout[$m][$i][$j];}
		}
	    }
	}
	if($m == 0 || $i != 0) {print "\n";}
    }
}











--Boundary-00=_6HCrA60zDbr3OA/--