Grep


 
Thread Tools Search this Thread
Top Forums UNIX for Advanced & Expert Users Grep
# 1  
Old 02-21-2006
Tools Grep

When searching for "text" in a file,
I would like to see the line containing "text"
and the line preceeding
and the line after
So I would like a 3 line output for each line matched by grep
Is there a quick way to accomplish this?
Example--

FILE.DAT contains

abcdef
123456789
xyz
hijklmnop
987654321

I would like the search for "xyz" to yield results such as:

FILE.DAT:2: 123456789
FILE.DAT:3: xyz
FILE.DAT:4: hijklmnop

Any suggestions?

A Tagore
atagore2@juno.com
# 2  
Old 02-21-2006
from gnu grep man page:
Code:
       -A NUM, --after-context=NUM
	      Print NUM	 lines	of  trailing  context  after  matching	lines.
	      Places  a	 line  containing  --  between	contiguous  groups  of
	      matches.

       -B NUM, --before-context=NUM
	      Print  NUM  lines	 of  leading  context  before  matching lines.
	      Places  a	 line  containing  --  between	contiguous  groups  of
	      matches.

I don't have GNU grep so I can't test it. But, I think this is what you are looking for.
# 3  
Old 02-21-2006
This is not completely correct and I can not fully debug it at this time, but it may help. Save the following as, say, /tmp/3linegrep.sed

Code:
/pattern/ {
    =
    H
    g
    n
    p
}
x
d

Given your input file and a pattern of xyz:

Code:
# sed -f /tmp/3linegrep.sed FILE.DAT
3
123456789
xyz
hijklmnop

This will display the pattern-matching line number followed by the previous line, the matched line, and the next line. There are special case issues -- last line with pattern, two successive lines with same pattern -- that I suspect do NOT work properly. It is quick and dirty.

I apologize if it is more confusing than helpful.
# 4  
Old 02-22-2006
small script

Hello,

You can this small script , may be it helps:

grep -n -v "0" inputfile > a1
var1=`grep "xyz" a1 |cut -d":" -f1`
var2=`expr $var1 + 1`
var3=`expr $var1 - 1`
grep "^$var3:" a1 > out
grep "^$var1:" a1 >> out
grep "^$var2:" a1 >> out


thanks

Aparna
# 5  
Old 02-22-2006
Quote:
Originally Posted by atagore
When searching for "text" in a file,
I would like to see the line containing "text"
and the line preceeding
and the line after
So I would like a 3 line output for each line matched by grep
Is there a quick way to accomplish this?
Example--

FILE.DAT contains

abcdef
123456789
xyz
hijklmnop
987654321

I would like the search for "xyz" to yield results such as:

FILE.DAT:2: 123456789
FILE.DAT:3: xyz
FILE.DAT:4: hijklmnop

Any suggestions?

A Tagore
atagore2@juno.com
Hey as per my knowledge you can try the cgrep command. In this command 1,1 represent matching line before and after. At the bottom of this reply i have added the usage of this command.

Command : cgrep -1,1 "xyz" FILE.DAT

Output :

123456789
xyz
hijklmnop

Usage of cgrep command :

Usage: cgrep [-pre[,post]] [-p] [-v] [-c] [-h] [-n] [-d string]
[-e] pattern [file...]

cgrep is a context grep. It displays more than the one matching line for
every match (2 before and 2 after as default).

-3 means display 3 lines before and 3 lines after the match (e.g.)
-5,12 means display 5 lines before the match and 12 lines after (e.g.)
-p means display only as much of the context as belongs to the
current paragraph. (paragraphs bounded by empty lines)
-v means invert search (display nomatches)
-c means display number of matching lines at the end of run
-h means toggle display filename before every line
-i means ignore case when matching the regexp
-n means display line number before every line
-d string means use string as the output delimiter string
-- (or -e) means end options (i.e. now comes the pattern,
for patterns starting with - )
pattern is a Perl regular expression (you better quote it !)

Please let me know if this works fine.
# 6  
Old 02-23-2006
Thank you everyone for your suggestions.

I am on SUN-OS box
I do not have the GNU grep
I do not have the cgrep
I can utilize the other suggestions...

Thanks once more...

A Tagore
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

Inconsistent `ps -eaf -o args | grep -i sfs_pcard_load_file.ksh | grep -v grep | wc -l`

i have this line of code that looks for the same file if it is currently running and returns the count. `ps -eaf -o args | grep -i sfs_pcard_load_file.ksh | grep -v grep | wc -l` basically it is assigned to a variable ISRUNNING=`ps -eaf -o args | grep -i sfs_pcard_load_file.ksh |... (6 Replies)
Discussion started by: wtolentino
6 Replies

2. UNIX for Dummies Questions & Answers

Piping grep into awk, read the next line using grep

Hi, I have a number of files containing the information below. """"" Fundallinfo 6.3950 14.9715 14.0482 """"" I would like to grep for Fundallinfo and use it to read the next line? I ideally would like to read the three numbers that follow in the next line and... (2 Replies)
Discussion started by: Paul Moghadam
2 Replies

3. UNIX for Dummies Questions & Answers

Bash - CLI - grep - Passing result to grep through pipe

Hello. I want to get all modules which are loaded and which name are exactly 2 characters long and not more than 2 characters and begin with "nv" lsmod | (e)grep '^nv???????????? I want to get all modules which are loaded and which name begin with "nv" and are 2 to 7 characters long ... (1 Reply)
Discussion started by: jcdole
1 Replies

4. Shell Programming and Scripting

AWK/GREP: grep only lines starting with integer

I have an input file 12.4 1.72849432773174e+01 -7.74784188610632e+01 12.5 9.59432114416327e-01 -7.87018212757537e+01 15.6 5.20139995965960e-01 -5.61612429666624e+01 29.3 3.76696387248366e+00 -7.42896194101892e+01 32.1 1.86899877018077e+01 -7.56508762501408e+01 35 6.98857157014640e+00... (2 Replies)
Discussion started by: chrisjorg
2 Replies

5. UNIX for Dummies Questions & Answers

Advanced grep'in... grep for data next to static element.

I have a directory I need to grep which consists of numbered sub directories. The sub directory names change daily. A file resides in this main directory that shows which sub directories are FULL backups or INCREMENTAL backups. My goal is to grep the directory for the word "full" and then... (2 Replies)
Discussion started by: SysAdm2
2 Replies

6. UNIX for Dummies Questions & Answers

Difference between grep, egrep & grep -i

Hi All, Please i need to know the difference between grep, egrep & grep -i when used to serach through a file. My platform is SunOS 5.9 & i'm using the korn shell. Regards, - divroro12 - (2 Replies)
Discussion started by: divroro12
2 Replies

7. Shell Programming and Scripting

grep for certain files using a file as input to grep and then move

Hi All, I need to grep few files which has words like the below in the file name , which i want to put it in a file and and grep for the files which contain these names and move it to a new directory , full file name -C20091210.1000-20091210.1100_SMGBSC3:1000... (2 Replies)
Discussion started by: anita07
2 Replies

8. UNIX for Dummies Questions & Answers

| help | unix | grep (GNU grep) 2.5.1 | advanced regex syntax

Hello, I'm working on unix with grep (GNU grep) 2.5.1. I'm going through some of the newer regex syntax using Regular Expression Reference - Advanced Syntax a guide. ls -aLl /bin | grep "\(x\)" Which works, just highlights 'x' where ever, when ever. I'm trying to to get (?:) to work but... (4 Replies)
Discussion started by: MykC
4 Replies

9. UNIX for Dummies Questions & Answers

| help | unix | grep - Can I use grep to return a string with exactly n matches?

Hello, I looking to use grep to return a string with exactly n matches. I'm building off this: ls -aLl /bin | grep '^.\{9\}x' | tr -s ' ' -rwxr-xr-x 1 root root 632816 Nov 25 2008 vi -rwxr-xr-x 1 root root 632816 Nov 25 2008 view -rwxr-xr-x 1 root root 16008 May 25 2008... (7 Replies)
Discussion started by: MykC
7 Replies

10. Shell Programming and Scripting

MEM=`ps v $PPID| grep -i db2 | grep -v grep| awk '{ if ( $7 ~ " " ) { print 0 } else

Hi Guys, I need to set the value of $7 to zero in case $7 is NULL. I've tried the below command but doesn't work. Any ideas. thanks guys. MEM=`ps v $PPID| grep -i db2 | grep -v grep| awk '{ if ( $7 ~ " " ) { print 0 } else { print $7}}' ` Harby. (4 Replies)
Discussion started by: hariza
4 Replies
Login or Register to Ask a Question