分类:
2009-12-30 10:05:04
#!/usr/bin/perl -w
use strict;
use vars qw(%format %datetime $flag);
sub usage
{
print "Usage: Log_analyzers format start_time end_time
exit -1;
}
sub datetime
{
my $j = 1;
my $line = shift @_;
my $string = shift @_;
my $format_str = shift @_;
my $time;
if ($line =~ /$string/) {
for (my $i = 0; $i < length($format_str); $i++) {
my $char = substr($format_str, $i, 1);
$datetime{$char} = eval "\$" . $j;
#print "$datetime{$char}\n";
$j++;
}
($time = $datetime{'Y'}) if (exists $datetime{'Y'});
($time = $datetime{'y'}) if (exists $datetime{'y'});
($time = $time . $datetime{'m'}) if (exists $datetime{'m'});
($time = $time . $datetime{'d'}) if (exists $datetime{'d'});
($time = $time . $datetime{'H'}) if (exists $datetime{'H'});
($time = $time . $datetime{'I'}) if (exists $datetime{'I'});
($time = $time . $datetime{'k'}) if (exists $datetime{'k'});
($time = $time . $datetime{'l'}) if (exists $datetime{'l'});
($time = $time . $datetime{'M'}) if (exists $datetime{'M'});
($time = $time . $datetime{'S'}) if (exists $datetime{'S'});
#print "$time ";
if ($flag == 1) {
$time = substr($time, 1, length($time -1));
}
return $time;
} else {
usage;
}
}
my ($date_format, $tmp, $time_start, $time_end, $string, $format_str, $keyword, $key, @filename);
$flag = 0;
%format = ('Y' => '(\d{4})',
'y' => '(\d{2})',
'm' => '([0-1]{1}\d{1})',
'd' => '(\d{2})',
'H' => '([0-2]{1}\d{1})',
'M' => '(\d{2})',
'S' => '(\d{2})',
'I' => '([0-1]{1}\d{1})',
'k' => '(\d{1,2})',
'l' => '(\d{1,2})'
);
if (@ARGV < 5) {
usage;
} else {
$date_format = shift @ARGV;
usage unless ($date_format =~ /%/);
$time_start = shift @ARGV;
$time_end = shift @ARGV;
while ($tmp = shift @ARGV) {
if ($tmp =~ /^<(.*)>$/) {
$key = $1;
$key =~ s/\./\\\./g;
$key =~ s/\*/\\\*/g;
$key =~ s/\^/\\\^/g;
$key =~ s/\?/\\\?/g;
$key =~ s/\$/\\\$/g;
$key =~ s/\|/\\\|/g;
$key =~ s/\]/\\\]/g;
$key =~ s/\[/\\\[/g;
$key =~ s/\\d/\\\\d/g;
$key =~ s/\\D/\\\\D/g;
$key =~ s/\\w/\\\\w/g;
$key =~ s/\\W/\\\\W/g;
$key =~ s/\\s/\\\\s/g;
$key =~ s/\\S/\\\\S/g;
if ($keyword) {
$keyword = $keyword . '.*' . $key;
} else {
$keyword = $key;
}
} else {
push(@filename, $tmp);
#print "$tmp\n";
}
}
#print "$date_format $time_start $time_end \n";
#print "keyword $keyword \n";
#print "filename @filename \n";
}
for (my $i = 0; $i < length($date_format); $i++) {
my $char = substr($date_format, $i, 1);
if ($char eq '%') {
$i++;
$char = substr($date_format, $i, 1);
$format_str = $format_str . $char;
#print "$format_str\n";
if ($char eq 'y') {
$flag = 1;
}
if (exists $format{$char}) {
$string = $string . $format{$char};
} else {
usage;
}
} else {
# if ($char eq '.') {
# $char = '\.';
# }
$char =~ s/\./\\\./g;
$char =~ s/\*/\\\*/g;
$char =~ s/\^/\\\^/g;
$char =~ s/\?/\\\?/g;
$char =~ s/\$/\\\$/g;
$char =~ s/\|/\\\|/g;
$char =~ s/\]/\\\]/g;
$char =~ s/\[/\\\[/g;
$string = $string . $char;
}
}
#print "$string\n";
my $t_start = datetime($time_start, $string, $format_str);
my $t_end = datetime($time_end, $string, $format_str);
#print "$t_start $t_end\n";
while (my $file = shift @filename) {
unless (-r $file) {
print "read file $file failed!\n";
exit -2;
}
open (F, "$file") || die "open $file error!";
while (my $lines =
if ($lines =~ /$keyword/) {
my $tmp_time = datetime($lines, $string, $format_str);
next if ($tmp_time < $t_start);
last if ($tmp_time > $t_end);
if ($tmp_time >= $t_start && $tmp_time <= $t_end) {
print "$lines";
}
}
}
close(F);
}