8870188 发表于 2018-8-31 08:48:08

perl日志分析

  转载于: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: parselogn";
  print'(d{4})',
  'y' => '(d{2})',
  'm' => '({1}d{1})',
  'L' => '(d{1,2})',
  'd' => '(d{2})',
  'D' => '(d{1,2})',
  'H' => '({1}d{1})',
  'M' => '(d{2})',
  'n' => '(d{2})',
  'S' => '(d{2})',
  's' => '(d{1,2})',
  'I' => '({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 &quot;Read $file failed!n&quot;;
  exit -2;
  }
  open (F, &quot;$file&quot;) || die &quot;open $file error!&quot;;
  $handle = 'F';
  } else {
  $handle = 'STDIN'; #从管道读取
  }
  while (my $lines = ) {
  if ($opt_k && !$opt_d) {
  print &quot;$lines&quot; 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_time1);
  }
  } else {
  Usage;
  }

页: [1]
查看完整版本: perl日志分析