でも問題があります。
ログ行に必ず、タイムスタンプがついていませんよね。
ガーン。。。
※みんな同意してくれると思っています。
で、結局目で追っていかないといけなくなるわけです。。。
それも面倒なのでperlでちょっとしたプログラムをこしらえてみました。
あんまり、テストしていませんが置いておきますので何かの参考になれば
#!/usr/bin/perl use warnings; use strict; use utf8; use Carp; use Fatal qw/ open close/ ; use Time::Piece; &_usage() if (scalar @ARGV == 0 or scalar @ARGV != 2); my $alert_log_file = validate_target_file( shift ); my $search_string = shift || ""; my $dates=q{}; open my $af, "<" , $alert_log_file; my $current_date = q{}; my @events; while (my $line = <$af>){ chomp $line; if (is_date($line)){ next if $current_date eq $line; $current_date = $line; my @current_events = @events; @events=(); $dates->{_translate_date($current_date)} = \@current_events; } else { next if $line !~ /$search_string/; push @events, $line; } } close $af; for my $date (sort keys %$dates){ next if ( (scalar @{$dates->{$date}}) == 0 ); print $date,"\n"; for my $event ( @{$dates->{$date}} ){ print "\t"; print $event, "\n"; } } sub _usage { print << 'EOF' Usage : grep_ora_alertlog [ALERT_LOGFILE] [PATTERN (Perl Regular Expressions)] EOF ; exit; } sub validate_target_file { $alert_log_file = shift; die "target file is not exist:$alert_log_file" if not -f $alert_log_file ; die "target file is not standard file:$alert_log_file" if not -f $alert_log_file ; return $alert_log_file; } sub is_date { my $date_string = shift; my $t; eval { $t = Time::Piece->strptime($date_string, q{%a %b %d %H:%M:%S %Y}); }; if (not $@){ return 1; } else{ return 0; } } sub _translate_date { my $date_string = shift; my $t; eval { $t = Time::Piece->strptime($date_string, q{%a %b %d %H:%M:%S %Y}); }; return $t->strftime('%Y-%m-%d %H:%M:%S'); }実行するとこんな感じ
[xxxxx@lenovo bin]$ grep_alertlog /u01/app/oracle/112/diag/rdbms/ora112/ora112/trace/alert_ora112.log memory 2011-08-26 20:53:19 Shared memory segment for instance monitoring created memory_target = 468M 2011-08-26 20:55:24 memory_target = 468M 2011-08-26 20:59:00 memory_target = 468M 2011-10-24 03:47:32 memory_target = 512M 2011-10-24 05:45:43 memory_target = 512M 2011-10-24 07:13:40 memory_target = 512M 2012-01-14 12:23:32 memory_target = 512M 2012-01-15 13:25:15 memory_target = 512M 2012-01-21 21:08:15 memory_target = 512M 2012-01-28 13:05:24 memory_target = 512M 2012-03-03 11:28:07 memory_target = 512M 2012-03-03 11:28:57 memory_target = 512M 2012-03-03 11:30:36 memory_target = 512M 2012-03-03 11:36:35 memory_target = 512M 2012-03-03 11:38:55 memory_target = 512M 2012-03-30 23:56:00 memory_target = 512M 2012-04-07 19:17:50 memory_target = 512M 2012-04-29 21:55:36 memory_target = 512M 2012-04-29 22:57:15 memory_target = 512MTime::Pieceを使っているので、perl -v が 5.9.5以降ですかね?
[xxxx@lenovo bin]$ corelist Time::Piece Time::Piece was first released with perl v5.9.5よく考えたら grep って PATTERN FILE だった。。
0 件のコメント:
コメントを投稿