[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/--