173

I want a way to search in a given text. For that, I use grep:

grep -i "my_regex"

That works. But given the data like this:

This is the test data
This is the error data as follows
. . . 
. . . .
. . . . . . 
. . . . . . . . .
Error data ends

Once I found the word error (using grep -i error data), I wish to find the 10 lines that follow the word error. So my output should be:

. . . 
. . . .
. . . . . . 
. . . . . . . . .
Error data ends

Are there any way to do it?

Benjamin W.
  • 33,075
  • 16
  • 78
  • 86
sriram
  • 7,077
  • 18
  • 54
  • 78
  • From your description it seems you want the 10 lines proceeding the word `error`. – ThomasW Mar 19 '15 at 05:33
  • Does this answer your question? [grep a file, but show several surrounding lines?](https://stackoverflow.com/questions/9081/grep-a-file-but-show-several-surrounding-lines) – Organic Advocate Jan 30 '20 at 23:09

4 Answers4

304

You can use the -B and -A to print lines before and after the match.

grep -i -B 10 'error' data

Will print the 10 lines before the match, including the matching line itself.

Jon Lin
  • 135,941
  • 26
  • 200
  • 209
  • 1
    Thanks this is working. But when I tried to store this execution in the variable like this `test=$(grep -i -B 10 'error' data)`, and print it using `echo $test`, I get the straight long lines as output. – sriram Sep 16 '12 at 09:35
  • 1
    Thanks I figured out I need to do like this `echo "$test"` rather than `echo $test` – sriram Sep 16 '12 at 09:37
  • 38
    `-C 10` will print out 10 lines before AND after in one fell swoop! – Joshua Pinter Jan 22 '18 at 15:19
  • is there a way to do this using a specific before point? say the length i have to grab prior is variable? – Erudaki Jul 17 '18 at 19:05
42

This prints 10 lines of trailing context after matching lines

grep -i "my_regex" -A 10

If you need to print 10 lines of leading context before matching lines,

grep -i "my_regex" -B 10

And if you need to print 10 lines of leading and trailing output context.

grep -i "my_regex" -C 10

Example

user@box:~$ cat out 
line 1
line 2
line 3
line 4
line 5 my_regex
line 6
line 7
line 8
line 9
user@box:~$

Normal grep

user@box:~$ grep my_regex out 
line 5 my_regex
user@box:~$ 

Grep exact matching lines and 2 lines after

user@box:~$ grep -A 2 my_regex out   
line 5 my_regex
line 6
line 7
user@box:~$ 

Grep exact matching lines and 2 lines before

user@box:~$ grep -B 2 my_regex out  
line 3
line 4
line 5 my_regex
user@box:~$ 

Grep exact matching lines and 2 lines before and after

user@box:~$ grep -C 2 my_regex out  
line 3
line 4
line 5 my_regex
line 6
line 7
user@box:~$ 

Reference: manpage grep

-A num
--after-context=num

    Print num lines of trailing context after matching lines.
-B num
--before-context=num

    Print num lines of leading context before matching lines.
-C num
-num
--context=num

    Print num lines of leading and trailing output context.
Charlotte Russell
  • 1,007
  • 1
  • 11
  • 15
  • 4
    Nice, ive had to look this up a few times now, maybe I can remember it as -A(FTER) -B(EFORE) -C(ONTEXT) – Opentuned Aug 30 '18 at 13:47
11

The way to do this is near the top of the man page

grep -i -A 10 'error data'
Ray Toal
  • 79,229
  • 13
  • 156
  • 215
8

Try this:

grep -i -A 10 "my_regex"

-A 10 means, print ten lines after match to "my_regex"

Desislav Kamenov
  • 1,155
  • 6
  • 13