|
转载于:http://blog.chinaunix.net/uid-20488859-id-1941150.html
#!/usr/bin/perl
use strict;
use Getopt::Std;
use vars qw($opt_d $opt_s $opt_e $opt_k $opt_g %date_format @filename $keyword $regular);
sub Usage
{
print "Usage: parselog [filename]n";
print '(d{4})',
'y' => '(d{2})',
'm' => '([0-1]{1}d{1})',
'L' => '(d{1,2})',
'd' => '(d{2})',
'D' => '(d{1,2})',
'H' => '([0-2]{1}d{1})',
'M' => '(d{2})',
'n' => '(d{2})',
'S' => '(d{2})',
's' => '(d{1,2})',
'I' => '([0-1]{1}d{1})',
'k' => '(d{1,2})',
'l' => '(d{1,2})',
'p' => '(am|pm)',
'w' => '(d{1})',
'a' => '(Mon|Tues|tue|Wed|Thurs|Fri|Sat|St|Sun)',
'A' => '(Monday|Tuesday|Wednesday|midweek|Thursday|Friday|Saturday|Sunday)',
'b' => '(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sept|sep|Oct|Nov|Dec)',
'B' => '(January|February|March|April|may|June|July|August|September|october|november|december)'
);
my ($string, $start_time, $end_time, $line_time);
Options;
if ($opt_d || $opt_k) {
if ($opt_d) {
$string = Parse_regular($opt_d);
$start_time = Parse_time($opt_s, $string);
$end_time = Parse_time($opt_e, $string);
Usage if (($start_time == -1) || ($end_time == -1));
}
my $handle; #文件描述符
my $multi_line = 0; #多行标识
my $key_flag = 0; #关键字匹配标识
my @multiline;
for(my $k = 0; $k < @filename; $k++) {
my $file = shift @filename;
if ($file ne 'STDIN') {
unless (-r $file) {
print "Read $file failed!n";
exit -2;
}
open (F, "$file") || die "open $file error!";
$handle = 'F';
} else {
$handle = 'STDIN'; #从管道读取
}
while (my $lines = ) {
if ($opt_k && !$opt_d) {
print "$lines" if ($lines =~ /$keyword/i);
next;
}
if ($opt_d && !$opt_k) {
$line_time = Parse_time($lines, $string);
next if (($multi_line == 0) && ($line_time < $start_time));
last if ($line_time > $end_time);
if ($line_time >= $start_time && $line_time $end_time) && ($key_flag == 0));
if (($line_time == -1) && ($multi_line == 1)) {
if ($lines =~ /$keyword/i) {
push (@multiline, $lines);
$key_flag = 1;
} else {
push (@multiline, $lines);
}
next;
}
$multi_line++;
if ($multi_line > 1) {
if ($key_flag == 1) {
while (my $buff = shift @multiline) {
print $buff;
}
}
$multi_line = 1;
$key_flag = 0;
}
@multiline = ();
push (@multiline, $lines);
if ($lines =~ /$keyword/i) { #时间+关键字=单行匹配
next if (($line_time != -1) && ($line_time < $start_time));
last if ($line_time > $end_time);
if ($line_time >= $start_time && $line_time 1);
}
} else {
Usage;
}
|
|
|