Pattern matching in file and then display 10 lines above every time


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Pattern matching in file and then display 10 lines above every time
# 8  
Old 01-30-2008
not tested for performance
Code:
awk '
{a[NR]=$0}
/pattern/{ 
   for(i=10;i>=1;i--){
    print a[NR-i]
   }
   for ( j=1;j<=NR-10;j++){
    delete a[j]
   }
} 
' "file"

# 9  
Old 01-30-2008
Hi, KevinADC.
Quote:
Originally Posted by KevinADC
The English module is known to create inefficiencies in perl programs. See the English man page for details: English - perldoc.perl.org

I am not sure if it affects the code you posted drl but you may want to take a look.
I looked over the reference, and added the sequence qw( -no_match_vars ) to my template. The warning is about a degradation in RE matching specifically. I added it to the short code I posted and it didn't seem to make a noticeable difference in a quick test (2 lines matched from the US Constitution from about 1000 lines). On the other hand, it's an easy thing to add.

Thanks for making me aware of that. Damian Conway does mention that in Perl Best Practices, but I haven't implemented all of that yet ... cheers, drl
# 10  
Old 01-31-2008
awk

Hi
This one maybe ok for you,just try!


Code:
nawk '{
line[NR]=$0
if (index($0,"pattern")!=0)
for (i=NR-10;i<=NR;i++)
print line[i]
}' filename

# 11  
Old 01-31-2008
Another suggestion...

Just give it a try and see.
Code:
for x in `grep -n "pattern" <filename> |cut -d":" -f1`
do
head -$x <filename> | tail -10
done

Its working but performance issue may be there.
# 12  
Old 01-31-2008
I think perl would be good for this, it certainly should be easy. Tie::File is good for working with large files since it does not read them into memory, but it does alter the original file so you have to make sure to open the file in readonly mode. A preliminary script:

Code:
#!/usr/bin/perl
use strict;
use warnings;
use Tie::File;
use Fcntl 'O_RDONLY';

tie my @file, 'Tie::File', 'path/to/file', mode => O_RDONLY
    or die "Can't open path/to/file: $!";
foreach my $i (10 .. $#file) {
    if ($file[$i] =~ /pattern/) {
        print qq{"pattern" found on line },$i+1,"$/";
        print qq{previous ten lines:$/}; 
        print map{"$_$/"} @file[$i-10 .. $i-1], "----------------------------";
    }
}

I am not sure how efficient/ineffiecient this is though.
# 13  
Old 01-31-2008
Quote:
Originally Posted by Karthikeyan_113
Its working but performance issue may be there.
I can see that if there are more than 1000 results, it will call heads and tails on the file for more than 1000 times.
# 14  
Old 10-20-2008
Quote:
Originally Posted by namishtiwari
It's telling illegal option -B;I am using HP-UX.
gnu grep has the -B option ( lines before ) and a -A option ( lines after ) as well. You may find this on your box as ggrep or something like that, otherwise you could certainly get the gnu grep out here somewhere:
Installing GCC: Binaries - GNU Project - Free Software Foundation (FSF)

hagar the horrible
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Display all lines after a matching variable

Hi, I have a file called abc.txt with the following dates 2016-01-27 2016-01-28 2016-01-29 2016-01-30 2016-01-31 2016-02-01 2016-02-02 2016-02-03 I would like to print all lines below if 2016-01-31 is found, excluding that date. I use this command --> sed '1,/2016-01-31/d' abc.txt If... (4 Replies)
Discussion started by: Nagesh_1985
4 Replies

2. UNIX for Dummies Questions & Answers

Grep -v lines starting with pattern 1 and not matching pattern 2

Hi all! Thanks for taking the time to view this! I want to grep out all lines of a file that starts with pattern 1 but also does not match with the second pattern. Example: Drink a soda Eat a banana Eat multiple bananas Drink an apple juice Eat an apple Eat multiple apples I... (8 Replies)
Discussion started by: demmel
8 Replies

3. Shell Programming and Scripting

Sed: printing lines AFTER pattern matching EXCLUDING the line containing the pattern

'Hi I'm using the following code to extract the lines(and redirect them to a txt file) after the pattern match. But the output is inclusive of the line with pattern match. Which option is to be used to exclude the line containing the pattern? sed -n '/Conn.*User/,$p' > consumers.txt (11 Replies)
Discussion started by: essem
11 Replies

4. Shell Programming and Scripting

Want to print out lines with a matching pattern from file

Hi all, I want to search for strings in file1 that can be found in file2 and print out the whole line when matching pattern is found. I have used the below command, but this is not working for me, because it is writing out only the matching patterns from file2, not the whole line. fgrep -o... (2 Replies)
Discussion started by: MonikaB
2 Replies

5. UNIX for Dummies Questions & Answers

FIND matching pattern of lines in a file

I need to search for two patterns in a file and find number of matching lines. find . -type f | xargs grep "DROP TABLE" | wc -l find . -type f | xargs grep "DROP SYNONYM" | wc -l The above code works. However I am looking at finding a commnd that will simplify as on a singe command... (2 Replies)
Discussion started by: Siva SQL
2 Replies

6. Shell Programming and Scripting

Finding lines matching the Pattern and their previous lines in a file

Hi, I am trying to locate the occurences of certain pattern like 'Possible network disconnect' in a text file. I can get the actual lines matching the pttern using: grep -w 'Possible network disconnect' file_name. But I am more interested in getting the timing of these events which are... (7 Replies)
Discussion started by: sagarparadkar
7 Replies

7. Shell Programming and Scripting

pattern matching lines using the date, and then joining the lines

Hi Guys, Was trying to attempt the below using awk and sed, have no luck so far, so any help would be appreciated. Current Text File: The first line has got an "\n", and the second line has got spaces/tabs then the word and "\n" TIME SERVER/CLIENT TEXT... (6 Replies)
Discussion started by: eo29
6 Replies

8. Shell Programming and Scripting

delete lines in file matching a pattern

I have a text file, a sample of which is as follows: r/- * 0: WINDOWS/Microsoft.NET/Framework/v2.0.50727/ASP.NETWebAdminFiles/Images/headerGRADIENT_Tall.gif r/- * 0: WINDOWS/SoftwareDistribution/Download/cf8ec753e88561d2ddb53e183dc05c3e/backoff.jpg r/- * 0: ... (2 Replies)
Discussion started by: stumpyuk
2 Replies

9. Shell Programming and Scripting

counting the lines matching a pattern, in between two pattern, and generate a tab

Hi all, I'm looking for some help. I have a file (very long) that is organized like below: >Cluster 0 0 283nt, >01_FRYJ6ZM12HMXZS... at +/99% 1 279nt, >01_FRYJ6ZM12HN12A... at +/99% 2 281nt, >01_FRYJ6ZM12HM4TS... at +/99% 3 283nt, >01_FRYJ6ZM12HM946... at +/99% 4 279nt,... (4 Replies)
Discussion started by: d.chauliac
4 Replies

10. Shell Programming and Scripting

Reading lines in a file matching a pattern

Hi, I need to redirect the lines in a file to a different file if the character starting from 2 to 6 in the line are numerical . Please let me know if anyone have any script to do this. Thanks, Ranjit (4 Replies)
Discussion started by: torenji
4 Replies
Login or Register to Ask a Question