X-Git-Url: http://dxcluster.net/gitweb/gitweb.cgi?a=blobdiff_plain;f=perl%2Fgrepdbg;h=80a918a07cc7a0a6a998d15240dd26746711bd75;hb=2733a992ac8c3d315c110a2cc1984ea0a5e5d0ff;hp=c44fc92b85c3a08f2565ef95e73f91a82886a1ca;hpb=9da1742219a27b1c02fd57794412088e4d7b3d1d;p=spider.git diff --git a/perl/grepdbg b/perl/grepdbg index c44fc92b..80a918a0 100755 --- a/perl/grepdbg +++ b/perl/grepdbg @@ -3,11 +3,21 @@ # Program to do a grep with dates and times on the debug # files # -# dispdbg [-nnn ...] +# grepdbg [nn] [-mm] # -# the -nnn is the day you what to look at -1 is yesterday -0 is today +# nn - is the day you what to look at: 1 is yesterday, 0 is today # and is optional if there is only one argument -# is the string, a caseless search is done +# +# -mmm - print the mmm lines before the match. So -10 will print +# ten lines including the line matching the regular expression. +# +# is the regular expression you are searching for, +# a caseless search is done +# +# If you specify something that likes a filename and that filename +# has a .pm on the end of it and it exists then rather than doing +# the regex match it executes the "main::handle()" function passing +# it one line at a time. # # @@ -23,44 +33,90 @@ BEGIN { unshift @INC, "$root/local"; } -use DXVars; +use SysVar; use DXUtil; use DXLog; +use Julian; use strict; -use vars qw(@list $fp @today $string); +use vars qw(@list $fp $today $string); + $fp = DXLog::new('debug', 'dat', 'd'); -@today = Julian::unixtoj(time()); +$today = $fp->unixtoj(time()); +my $nolines = 1; +my @prev; for my $arg (@ARGV) { if ($arg =~ /^-/) { $arg =~ s/^-//o; + if ($arg =~ /^\s*\-+(?:[h\?]e?l?p?)/) { + usage(); + exit(0); + } push @list, $arg; + } elsif ($arg =~ /^\d+$/) { + $nolines = $arg; + } elsif ($arg =~ /\.pm$/) { + if (-e $arg) { + my $fn = $arg; + $fn =~ s/\.pm$//; + eval { require $arg}; + die "requiring $fn failed $@" if $@; + } else { + die "$arg not found"; + } } else { $string = $arg; last; } } -die "usage: dispdbg [[-nnn] ..] \n" unless $string; + +$string ||= '.*'; push @list, "0" unless @list; for my $entry (@list) { - my @now = Julian::sub(@today, $entry); - my $fh = $fp->open(@now); + my $now = $today->sub($entry); + my $fh = $fp->open($now); my $line; + my $do; + + if (main->can('handle')) { + $do = \&handle; + } else { + $do = \&process; + } + + begin() if main->can('begin'); if ($fh) { while (<$fh>) { - my $line = $_; - chomp $line; - if ($line =~ m{\Q$string}io) { - my @line = split '\^', $line; - my $t = shift @line; - print atime($t), ' ', join('^', @line), "\n"; - } + &$do($_); } $fp->close(); } + end() if main->can('end'); +} + +sub process +{ + my $line = shift; + chomp $line; + push @prev, $line; + shift @prev while @prev > $nolines; + if ($line =~ m{$string}io) { + for (@prev) { + s/([\x00-\x1f\x7f-\xff])/sprintf("\\x%02X", ord($1))/eg; + my ($t, $l) = split /\^/, $_, 2; + print atime($t), ' ', $l, "\n"; + print '----------------' if $nolines > 1; + } + @prev = (); + } +} + +sub usage +{ + die "usage: grepdbg [nn days before] [-nnn lines before] [|]\n"; } exit(0);