Get a Grip on the Grep! – 15 Practical Grep Command Examples

by SathiyaMoorthy on March 26, 2009

Grip on the Unix Grep Command
Photo courtesy of Alexôme’s

This is part of the on-going 15 Examples series, where 15 detailed examples will be provided for a specific command or functionality.  Earlier we discussed 15 practical examples for Linux find command,  Linux command line history and mysqladmin command.


In this article let us review 15 practical examples of Linux grep command that will be very useful to both newbies and experts.


First create the following demo_file that will be used in the examples below to demonstrate grep command.

$ cat demo_file
THIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.
this line is the 1st lower case line in this file.
This Line Has All Its First Character Of The Word With Upper Case.

Two lines above this line is empty.
And this is the last line.

1. Search for the given string in a single file

The basic usage of grep command is to search for a specific string in the specified file as shown below.

Syntax:
grep "literal_string" filename

$ grep "this" demo_file
this line is the 1st lower case line in this file.
Two lines above this line is empty.

2. Checking for the given string in multiple files.

Syntax:
grep "string" FILE_PATTERN


This is also a basic usage of grep command. For this example, let us copy the demo_file to demo_file1. The grep output will also include the file name in front of the line that matched the specific pattern as shown below. When the Linux shell sees the meta character, it does the expansion and gives all the files as input to grep.

$ cp demo_file demo_file1

$ grep "this" demo_*
demo_file:this line is the 1st lower case line in this file.
demo_file:Two lines above this line is empty.
demo_file:And this is the last line.
demo_file1:this line is the 1st lower case line in this file.
demo_file1:Two lines above this line is empty.
demo_file1:And this is the last line.

3. Case insensitive search using grep -i

Syntax:
grep -i "string" FILE


This is also a basic usage of the grep. This searches for the given string/pattern case insensitively. So it matches all the words such as “the”, “THE” and “The” case insensitively as shown below.

$ grep -i "the" demo_file
THIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.
this line is the 1st lower case line in this file.
This Line Has All Its First Character Of The Word With Upper Case.
And this is the last line.

4. Match regular expression in files

Syntax:
grep "REGEX" filename


This is a very powerful feature, if you can use use regular expression effectively. In the following example, it searches for all the pattern that starts with “lines” and ends with “empty” with anything in-between. i.e To search “lines[anything in-between]empty” in the demo_file.

$ grep "lines.*empty" demo_file
Two lines above this line is empty.

From documentation of grep: A regular expression may be followed by one of several repetition operators:

  • ? The preceding item is optional and matched at most once.
  • * The preceding item will be matched zero or more times.
  • + The preceding item will be matched one or more times.
  • {n} The preceding item is matched exactly n times.
  • {n,} The preceding item is matched n or more times.
  • {,m} The preceding item is matched at most m times.
  • {n,m} The preceding item is matched at least n times, but not more than m times.

5. Checking for full words, not for sub-strings using grep -w

If you want to search for a word, and to avoid it to match the substrings use -w option. Just doing out a normal search will show out all the lines.

The following example is the regular grep where it is searching for “is”. When you search for “is”, without any option it will show out “is”, “his”, “this” and everything which has the substring “is”.

$ grep -i "is" demo_file
THIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.
this line is the 1st lower case line in this file.
This Line Has All Its First Character Of The Word With Upper Case.
Two lines above this line is empty.
And this is the last line.


The following example is the WORD grep where it is searching only for the word “is”. Please note that this output does not contain the line “This Line Has All Its First Character Of The Word With Upper Case”, even though “is” is there in the “This”, as the following is looking only for the word “is” and not for “this”.

$ grep -iw "is" demo_file
THIS LINE IS THE 1ST UPPER CASE LINE IN THIS FILE.
this line is the 1st lower case line in this file.
Two lines above this line is empty.
And this is the last line.

6. Displaying lines before/after/around the match using grep -A, -B and -C

When doing a grep on a huge file, it may be useful to see some lines after the match. You might feel handy if grep can show you not only the matching lines but also the lines after/before/around the match.


Please create the following demo_text file for this example.

$ cat demo_text
4. Vim Word Navigation

You may want to do several navigation in relation to the words, such as:

 * e - go to the end of the current word.
 * E - go to the end of the current WORD.
 * b - go to the previous (before) word.
 * B - go to the previous (before) WORD.
 * w - go to the next word.
 * W - go to the next WORD.

WORD - WORD consists of a sequence of non-blank characters, separated with white space.
word - word consists of a sequence of letters, digits and underscores.

Example to show the difference between WORD and word

 * 192.168.1.1 - single WORD
 * 192.168.1.1 - seven words.

6.1 Display N lines after match

-A is the option which prints the specified N lines after the match as shown below.

Syntax:
grep -A <N> "string" FILENAME


The following example prints the matched line, along with the 3 lines after it.

$ grep -A 3 -i "example" demo_text
Example to show the difference between WORD and word

* 192.168.1.1 - single WORD
* 192.168.1.1 - seven words.

6.2 Display N lines before match

-B is the option which prints the specified N lines before the match.

Syntax:
grep -B <N> "string" FILENAME


When you had option to show the N lines after match, you have the -B option for the opposite.

$ grep -B 2 "single WORD" demo_text
Example to show the difference between WORD and word

* 192.168.1.1 - single WORD

6.3 Display N lines around match

-C is the option which prints the specified N lines before the match. In some occasion you might want the match to be appeared with the lines from both the side. This options shows N lines in both the side(before & after) of match.

$ grep -C 2 "Example" demo_text
word - word consists of a sequence of letters, digits and underscores.

Example to show the difference between WORD and word

* 192.168.1.1 - single WORD

7. Highlighting the search using GREP_OPTIONS

As grep prints out lines from the file by the pattern / string you had given, if you wanted it to highlight which part matches the line, then you need to follow the following way.

When you do the following export you will get the highlighting of the matched searches. In the following example, it will highlight all the this when you set the GREP_OPTIONS environment variable as shown below.

$ export GREP_OPTIONS='--color=auto' GREP_COLOR='100;8'

$ grep this demo_file
this line is the 1st lower case line in this file.
Two lines above this line is empty.
And this is the last line.

8. Searching in all files recursively using grep -r

When you want to search in all the files under the current directory and its sub directory. -r option is the one which you need to use. The following example will look for the string “ramesh” in all the files in the current directory and all it’s subdirectory.

$ grep -r "ramesh" *

9. Invert match using grep -v

You had different options to show the lines matched, to show the lines before match, and to show the lines after match, and to highlight match. So definitely You’d also want the option -v to do invert match.

When you want to display the lines which does not matches the given string/pattern, use the option -v as shown below. This example will display all the lines that did not match the word “go”.

$ grep -v "go" demo_text
4. Vim Word Navigation

You may want to do several navigation in relation to the words, such as:

WORD - WORD consists of a sequence of non-blank characters, separated with white space.
word - word consists of a sequence of letters, digits and underscores.

Example to show the difference between WORD and word

* 192.168.1.1 - single WORD
* 192.168.1.1 - seven words.

10. display the lines which does not matches all the given pattern.

Syntax:
grep -v -e "pattern" -e "pattern"

$ cat test-file.txt
a
b
c
d

$ grep -v -e "a" -e "b" -e "c" test-file.txt
d

11. Counting the number of matches using grep -c

When you want to count that how many lines matches the given pattern/string, then use the option -c.

Syntax:
grep -c "pattern" filename

$ grep -c "go" demo_text
6


When you want do find out how many lines matches the pattern

$ grep -c this demo_file
3


When you want do find out how many lines that does not match the pattern

$ grep -v -c this demo_file
4

12. Display only the file names which matches the given pattern using grep -l

If you want the grep to show out only the file names which matched the given pattern, use the -l (lower-case L) option.

When you give multiple files to the grep as input, it displays the names of file which contains the text that matches the pattern, will be very handy when you try to find some notes in your whole directory structure.

$ grep -l this demo_*
demo_file
demo_file1

13. Show only the matched string

By default grep will show the line which matches the given pattern/string, but if you want the grep to show out only the matched string of the pattern then use the -o option.

It might not be that much useful when you give the string straight forward. But it becomes very useful when you give a regex pattern and trying to see what it matches as

$ grep -o "is.*line" demo_file
is line is the 1st lower case line
is line
is is the last line

14. Show the position of match in the line

When you want grep to show the position where it matches the pattern in the file, use the following options as

Syntax:
grep -o -b "pattern" file

$ cat temp-file.txt
12345
12345

$ grep -o -b "3" temp-file.txt
2:3
8:3


Note: The output of the grep command above is not the position in the line, it is byte offset of the whole file.

15. Show line number while displaying the output using grep -n

To show the line number of file with the line matched. It does 1-based line numbering for each file. Use -n option to utilize this feature.

$ grep -n "go" demo_text
5: * e - go to the end of the current word.
6: * E - go to the end of the current WORD.
7: * b - go to the previous (before) word.
8: * B - go to the previous (before) WORD.
9: * w - go to the next word.
10: * W - go to the next WORD.

Awesome Linux Articles

Following are few awesome 15 examples articles that you might find helpful.

Download Free eBook - Linux 101 Hacks

Get free Unix tutorials, tips and tricks straight to your email in-box.

If you enjoyed this article, you might also like..

  1. Mommy, I found it! — 15 Practical Linux Find Command Examples
  2. 10 Awesome Examples for Viewing Huge Log Files in Unix
  3. Unix Sed Tutorial: Multi-Line File Operation with 6 Practical Examples
  4. Can You Top This? 15 Practical Linux Top Command Examples
  5. 5 Practical Examples To Delete / Remove Directory in Linux
  

Vim 101 Hacks Book

{ 8 trackbacks }

Varios ejemplos de uso del comando grep
May 4, 2009 at 1:01 am
Open & View 10 Different File Types with Linux Less Command - The Ultimate Power of Less
May 9, 2009 at 5:32 pm
Mommy, I found it! — 15 Practical Linux Find Command Examples
June 11, 2009 at 11:58 pm
10 Awesome Examples for Viewing Huge Log Files in Unix
August 12, 2009 at 12:02 am
Linux Crontab: 15 Awesome Cron Job Examples
August 15, 2009 at 11:55 am
Unix LS Command: 15 Practical Examples
August 15, 2009 at 12:11 pm
Top 5 Best Linux OS Distributions
August 22, 2009 at 12:28 am
A Total Newbies guide to a few Linux commands « Of Code and Me
September 2, 2009 at 7:21 am

{ 38 comments… read them below or add one }

1 Joao Trindade March 28, 2009 at 3:54 am

You have a small glitch:
>> 4. Match regular expression in files using grep -i

Don’t you mean:
4. Match regular expression in files using grep -e

The rest of the post is great.

2 Ramesh March 29, 2009 at 12:16 am

Joao,

Thanks for pointing it out. I have corrected it. Also, we can do REGEX without the option -e as shown in the example #4.

 
From Man Pages:

SYNOPSIS
  grep [options] PATTERN [FILE...]
  grep [options] [-e PATTERN | -f FILE] [FILE...]

-e PATTERN, --regexp=PATTERN
Use PATTERN as the pattern; useful to protect patterns beginning with -.
3 dragon March 31, 2009 at 11:26 pm

Hi:

FYI, tip 14 will be
2:3
8:3
on Ubuntu system. (including the \n character I guess

4 Ramesh March 31, 2009 at 11:44 pm

Dragon,

Thanks for pointing it out. I’ve corrected it.

5 Francesco Talamona April 26, 2009 at 2:48 am

I find very useful the following command, when you have to deal with a very lengthy configuration file full of comments:

grep -v -E ‘^\#|^$’ /etc/squid/squid.conf

It skips every line beginning with an hash (#) or empty, so you can see at a glance the 15 lines edited out of a +4400 lines text file.

BTW interesting topics, great posts…

6 albar May 7, 2009 at 7:51 pm

help me
how to bzgrep : ^C02
but ^C is count as one special character,
in this word:
data1^C02data2

thank’s

7 Ramesh Natarajan May 8, 2009 at 5:51 pm

@Francesco Talamona,
Thanks a lot for sharing your grep command example. Yes. all those empty lines and comment lines can get very annoying when you do grep. So, it is an excellent idea to hide them in the grep output with your examples.

8 sasikala May 11, 2009 at 9:41 pm

@albar,

try like this
grep ‘\^C02′

9 albar May 12, 2009 at 1:18 am

@sasikala ,
i do have try that too, but still got nothing,
but it works when ^ and C count as two character

thank’s

10 SathiyaMoorthy May 12, 2009 at 4:33 am

@albar

You should type ^C as ctrl-v + ctrl-c in grep as single character as
$ grep ^C02 file

Dont escape, dont type it as ^ C as two characters. Hope this helps.

11 albar May 12, 2009 at 8:59 pm

@sathiya,
god bless u all
it work’s thanks

12 Manish Patel May 21, 2009 at 7:00 pm

Hi

I am trying to exclude the last word of all the line like sync.php, uploads.php, backup.php

File text include as below

/usr/home/htdocs/drag-and-drop/htdocs.php
/usr/home//htdocs/sms/publish/pages/sync.php
/usr/home/htdocs/track/backup.php
/usr/home/htdocs/smstest/smstest.php
/usr/home/htdocs/uploads.php
/usr/home/htdocs/017/backup.php

How can I achieve that using grep or sed or awk

Also how I can use “*” wildcard in sed command like to replace *.php to *.txt or any other extension.

Thank you in advance.

Manish

13 Francesco Talamona May 21, 2009 at 10:36 pm

Are you restricted to sed or awk?

1)
dirname ‘/usr/home/htdocs/drag-and-drop/htdocs.php’
/usr/home/htdocs/drag-and-drop

2)
rename does what you want

14 Manish Patel May 24, 2009 at 6:55 pm

Hi,

Those lines are the contents of the text file and I don’t want to change the actual directory or the file on server. I want to change the contents of the file where all file file names ending at the line should be removed. So the final file contents should look like this

cat filecontenet.txt
/usr/home/htdocs/drag-and-drop/
/usr/home//htdocs/sms/publish/pages/
/usr/home/htdocs/track/
/usr/home/htdocs/smstest/
/usr/home/htdocs/
/usr/home/htdocs/

I think rename would not help here in editing file contents.

Thank you
Manish

15 SathiyaMoorthy May 24, 2009 at 11:43 pm

rev filecontenet.txt | cut -d’/’ -f2- | rev

rev filecontenet.txt –> reverses the file and pipes to cut command.
cut -d’/’ -f2- –> cuts off the first field ( cuts off last field, as it is reversed ).
rev –> prints the output given order.

16 P0B0T May 26, 2009 at 11:36 pm

Manish,

I believe you’re looking for the following

sed -e ’s/.php$//’ filecontenet.txt

17 P0B0T May 26, 2009 at 11:39 pm

Sorry, didn’t read your requirement carefully.

Try this:

sed -e ’s/\/[^/]*.php$/\//’ filecontenet.txt

18 Manish Patel June 5, 2009 at 5:31 pm

Hi

Thank you to Sathiya Moorthy and P0B0T.

Both solution worked very nicely for me.

P0B0T can you explain how your command works for each defined option ’s/\/[^/]*.php$/\//’

Thank you
Manish

19 mano June 10, 2009 at 3:00 am

The above info on grep is really great. I want to search for a string in all the files in the directory and add a $ symbol at the start of the searched line and save in the same file.

20 SathiyaMoorthy June 18, 2009 at 10:49 pm

@mano
More than using grep for this requirement, you can use sed which is:
sed -i ’s/.*abc.*/$&/’ *

-i : edit the input file.
s/// : substitute the matched pattern with the replacement string.
/.*abc.*/ : match the string abc
/$&/ : Replace with $ followed by matched string.
* : all the files in the current directory.

This is one way of satisfying your requirement, there may be other efficient ways.

Hope this helps.

21 mano June 19, 2009 at 12:17 am

Hi SathiaMoorthy, Thank u so much. it works fine. If I need to search for files in all subdirectories, how should this “sed” command modified?

Thanks in advance.

mano

22 SathiyaMoorthy June 27, 2009 at 12:05 am

@mano
Modification in sed command is not needed.

To search for all files in the subdirectory.
find . -type f

Execute the command on all those files with -exec.
find . -type f -exec sed -i ’s/.*abc.*/#&/’ {} \;

But think twice before executing this command, because it will recursively edit all the files. Taking backup before executing this command is wise.

Refer the earlier article linux find command examples.

23 Vidya July 1, 2009 at 2:59 am

Hi,

I want to grep next 3 words in a line from the matching criteria word..
like if the line is

This is -g gateway -e enterprise -s server

Then I want to grep “-g gateway -e enterprise” from the line

Can you please help me in this case.
Here gateway and enterprise value can be anything so need to grep next 3 words starting form “-g”

24 SathiyaMoorthy July 1, 2009 at 5:58 am

@Vidhya

$ grep -o -E — “-g \w+ -e \w+” FILENAME
-g gateway -e enterprise

Explanation of the above command.,

-o : only matching ( point 13. )
-E : extended regexp
— : indicate end of options
\w+ : word

25 Vidya July 1, 2009 at 9:00 am

Hi Sathiya,
Its not working.
It says
grep: illegal option — o
grep: illegal option — E
Usage: grep -hblcnsviw pattern file . . .

I am working on Solaris and setting shell as bash.

26 Amit Agarwal September 21, 2009 at 6:18 am

grep version on solaris is little older and as man would show you all these options are not available, so you can try ack (standalone) version which is very powerful and requires only perl to be installed.

27 learner October 7, 2009 at 5:31 am

Hi,
How to use grep to find lines containing multiple strings
ex: line1:Today is oct 7, wednesday. not 8th
line2: This is not summer.
line3: when is summer?
I want to return line2 containing strings “not” and “summer” both.

Thank You.

28 SathiyaMoorthy October 7, 2009 at 10:41 am

@learner

There are several ways possible, use the one which you find as appropriate.

$ grep "not.*summer" file1
line2: This is not summer.

$ grep "not" file1 | grep "summer"
line2: This is not summer.
29 learner October 7, 2009 at 10:56 pm

@SathiyaMoorthy

Thank You for your very quick reply.

My question was not piping and hard coding every string , as i mentioned multiple strings, i was looking for something in likes of
grep -F ’string1
string2
string3
string4
…..
stringn’ filename
which returns single occurrence of something like either string1 ,string2,.. stringn or all .., what i wanted was only string1 and string2 and ……. stringn begin returned.
[please note that i will be provided with strings as newline separated strings ,which i don't want to parse again and i have constraint of using grep only]

Thank You.

30 Ashish December 1, 2009 at 4:07 pm

Hi,

I need to sthing like this
I have a file containing 400 domainId values seprated by new line
ex. domain.txt
domain1
domain2
domain3…

I have a script that takes each domain and calls an api that returns me an xml.
like this for each domain
val1
domain1
val2
val3
val4
XXX
val1

now i want to spit out the domain name in a file that does not matches domainid value XXX.

how can i do it using grep
TIA

31 Ashish December 1, 2009 at 4:16 pm

Hi,

I need to sthing like this
I have a file containing 400 domainId values seprated by new line
ex. domain.txt
domain1
domain2
domain3…

I have a script that takes each domain and calls an api that returns me an xml.
like this for each domain

<tag1>val1</tag1>
<domain>domain1</domain>
<tag2>val2</tag2>
<tag3>val3</tag3>
<tag4>val4</tag4>
<domainid>XXX</domainid>
<tag5>val1</tag5>

now i want to spit out the domain name in a file that does not matches domainid value XXX.

how can i do it using grep
TIA

32 Varun December 17, 2009 at 7:16 am

Hi,
The options mentioned in point 6 for displaying the context with A, B, & C does not seem to work on Solaris 10 with both grep & egrep

Is there a version of this grep available for Solaris?

Thank you,
Varun.

33 Jawn Hewz December 21, 2009 at 7:54 pm

Does the -b (byte offset) work when greping binary files? I do not get an offset returned when I grep a binary file, but I do when using a text file. I am using grep under Cygwin.

34 fety January 11, 2010 at 3:32 am

thanks very much for this tutorial. it is very helpful..

35 eMancu January 24, 2010 at 12:49 pm

Awsome tutorial!
I’m reading all your blog, its amazing!

36 Raghu Baba January 30, 2010 at 4:44 am

Hai.. I want to Parse my file .. Word to Excel .. so tell me some grep & cut commands…

37 Jeff Floyd February 1, 2010 at 6:54 pm

Whats the difference between $ grep -c ill memo and $ grep -n ill memo?

38 joeq February 4, 2010 at 3:57 am

hi
i got 1 problem…how can i find a numbers like 99,000,000.95 in my server database using unix command..
tq

Leave a Comment

Previous post:

Next post: