in reply to Re: printing several lines around match
in thread printing several lines around match

Very good, works fine -the only problem it doesn't print the lines before match,only after
  • Comment on Re^2: printing several lines around match

Replies are listed 'Best First'.
Re^3: printing several lines around match
by roboticus (Chancellor) on Jun 19, 2012 at 16:40 UTC

    auto_w:

    Sure it can. When you find the match you've the previous few lines, and can print them. The technique is just to show you how to keep track of the last few lines, in case you need to save some history.

    Update: When I first read your post, I thought you wanted the code to predict the future!

    ...roboticus

    When your only tool is a hammer, all problems look like your thumb.

Re^3: printing several lines around match
by muba (Priest) on Jun 19, 2012 at 13:41 UTC

    Untested, but I think it should get you on the right track.

    #!/usr/bin/perl -w use strict; use warnings; my $m_1 = "Receive message"; @ARGV == 2 || die "usage: $0 TAB_1 TAB_5\n"; my ( $TAB_11, $TAB_35 ) = @ARGV; my @files = <./*.log>; # Fixed inconsistent indentation. foreach my $file (@files) { print $file . "\n"; my @last_few_lines; my $how_many_lines = 3; my $matched = 0; open (my $HAN, $file) || die "Cannot open '$log' because: $!"; while ( (not $matched) && <$HAN> ) { # As per roboticus, slightly altered though: push @last_few_lines, $_; shift @last_few_lines if @last_few_lines > $how_many_lines; if ( m/$TAB_11|$TAB_35/ && m/$m_1/) { print @last_few_lines, $&; # Note that $& will contain the matched results from the # m/$m_1/ match, in your and my designs both. $matched = 1; } if ($matched) { $matched = 0; for (1..$how_many_lines) { print <$HAN>; last if eof $HAN; } } } }
      Use of uninitialized value $_ in pattern match (m//) at ./perl4line.pl line 25, <$HAN> line 109. Use of uninitialized value $_ in pattern match (m//) at ./perl4line.pl line 25, <$HAN> line 110. Use of uninitialized value $_ in pattern match (m//) at ./perl4line.pl line 25, <$HAN> line 111. Use of uninitialized value $_ in pattern match (m//) at ./perl4line.pl line 25, <$HAN> line 112. Use of uninitialized value $_ in pattern match (m//) at ./perl4line.pl line 25, <$HAN> line 113. Use of uninitialized value $_ in pattern match (m//) at ./perl4line.pl line 25, <$HAN> line 114. Use of uninitialized value $_ in pattern match (m//) at ./perl4line.pl line 25, <$HAN> line 115. Use of uninitialized value $_ in pattern match (m//) at ./perl4line.pl line 25, <$HAN> line 116. Use of uninitialized value $_ in pattern match (m//) at ./perl4line.pl line 25, <$HAN> line 117. Use of uninitialized value $_ in pattern match (m//) at ./perl4line.pl line 25, <$HAN> line 118. Use of uninitialized value $_ in pattern match (m//) at ./perl4line.pl line 25, <$HAN> line 119. Use of uninitialized value $_ in pattern match (m//) at ./perl4line.pl line 25, <$HAN> line 120. Use of uninitialized value $_ in pattern match (m//) at ./perl4line.pl line 25, <$HAN> line 121. Use of uninitialized value $_ in pattern match (m//) at ./perl4line.pl line 25, <$HAN> line 122. Use of uninitialized value $_ in pattern match (m//) at ./perl4line.pl line 25, <$HAN> line 123.

        Ain't that one sweet helluva mess.

        Change the while line into this. I think it should solve it. But again, untested.

        while ( <$HAN> ) {

        But more importantly, instead of verbatim copying that code, try to understand what's going on. Try to understand what I am doing, and why, and how. Of course, my way is not the only way and for all I know it might not even be the best way, but it's the thought process that matters.