GREP is a command line search utility or tool to filter the input given to it. Grep got it’s name from ed editor as g/re/p (global / regular expression / print). Grep command can improve a command output by filtering out required information. Grep will become a killer command when we combined it with regular expressions. In this post we will see how to use grep in a basic way and then move on some advanced and rarely used options. In our next couple of posts we will see what grep can do with the help of regular expressions.

GREP command syntax

grep [options] [searchterm] filename

or

command | grep [options] [searchterm]

Before starting grep command examples, I used below file which contain following content.

cat file1.txt

Output:

surendra 31 IBM Chennai
Steve 45 BOA London
Barbi 25 EasyCMDB Christchurch
Max 25 Easy CMDB Christchurch
Nathan 20 Wipro Newyark
David 20 ai Newyark

Search single file using grep

Example 1: Search for a word “nathan” in file1.txt

grep nathan file1.txt

You don’t get any output, as the word nathan is not there. By this type you should know grep is a case sensitive command. If you want specifically Nathan, use caps N in nathan and try once again.

Example 2: Search for exact word “Nathan”

root@linuxnix:~# grep Nathan file1.txt
 Nathan 20 Wipro Newyark

Example 3: Search for a word which has either capital or small letters in it, no confusion between nathan or Nathan. The -i for ignore case.

root@linuxnix:~# grep -i Nathan file1.txt
 Nathan 20 Wipro Newyark

Example 4: I suggest you always use single quotes for your search term. This will avoid confusions to gerp. Suppose if you want to search for “Easy CMDB” in a file, it will be difficult to search without single quotes. Try below examples.

without quotes:

root@linuxnix:~# grep Easy CMDB file1.txt
 grep: CMDB: No such file or directory
 file1.txt:Barbi 25 EasyCMDB Christchurch
 file1.txt:Max 25 Easy CMDB Christchurch

What grep did?

If you observe, you got an error stating that, there is no file called CMDB. That is true, there is no such file. This output have two issues
1) Grep is considering second word in the command as file
2) Grep is considering just “Easy” as a search term.

Example 5: Search for exact search term using single quotes.

root@linuxnix:~# grep 'Easy CMDB' file1.txt
 Max 25 Easy CMDB Christchurch

You may get a doubt why single quotes and not double quotes. You can use double quotes as well when you want to send bash variable in to search term.

Example 6: Search for a shell variable in a file. My shell is NAME1 which is assigned with Nathan. See below examples with single and double quotes.

root@linuxnix:~# NAME1=Nathan
 root@linuxnix:~# grep '$NAME1' file1.txt

No output, now try with double quotes

root@linuxnix:~# grep "$NAME1" file1.txt
 Nathan 20 Wipro Newyark
 root@linuxnix:~#

See the difference? So it depends when you want to use single quotes and double quotes. If you want to pass shell variables to grep use double quotes and remaining time always use single quotes.

Example 7: If you want to inverse your search criteria ie to display all the lines which do not contain your search term then use -v option. This will display all the lines which do not contain your search term. Suppose list all the lines which do not contain Nathan in the file.

root@linuxnix:~# grep -v 'Nathan' file1.txt
 surendra 31 IBM Chennai
 Steve 45 BOA London
 Barbi 25 EasyCMDB Christchurch
 Max 25 Easy CMDB Christchurch
 David 20 ai Newyark

Example 8: How about getting count of a word in a file? Search for word ‘Easy’ and tell me how many times it is there in the file.

root@linuxnix:~# grep -c 'Easy' file1.txt
 2

Example 9: Ok, finding number of occurrence is fine, how about displaying line number as well for our search term? Search for Easy and display line number where that word is present.

root@linuxnix:~# grep -n 'Easy' file1.txt
 3:Barbi 25 EasyCMDB Christchurch
 4:Max 25 Easy CMDB Christchurch

Example 10: Some times you want to find exact word instead of finding occurrence of a word sequence. Suppose you want to find is word in a file, this will grep “this” as well as “this” contain “is” in it. Grep have a Technic to do this with the help of -w which filter out this type of stuff. Suppose I want to search for ai in our file, with normal grep it will print first and last lines as both contain ai in them. Use -w for avoiding this stuff.

With out -w option:

root@linuxnix:~# grep 'ai' file1.txt
 surendra 31 IBM Chennai
 David 20 ai Newyark

With -w option:

root@linuxnix:~# grep -w 'ai' file1.txt
 David 20 ai Newyark

Example 11: Grep have special feature which can print lines before, after and between for a search term. Suppose if you want print two lines before to the search, use below example. Search for Max and below example prints two lines above search term as well. This will be handy when searching for log files.

root@linuxnix:~# grep -B 2 'Max' file1.txt
 Steve 45 BOA London
 Barbi 25 EasyCMDB Christchurch
 Max 25 Easy CMDB Christchurch

Example 12: Search for a word and print two lines after to this search

root@linuxnix:~# grep -A 2 'Barbi' file1.txt
 Barbi 25 EasyCMDB Christchurch
 Max 25 Easy CMDB Christchurch
 Nathan 20 Wipro Newyark

Example 13: Search for a word and print one line Before and after center to this search term

root@linuxnix:~# grep -C 1 'Max' file1.txt
 Barbi 25 EasyCMDB Christchurch
 Max 25 Easy CMDB Christchurch
 Nathan 20 Wipro Newyark

Search multiple files using grep

Example 14: Grep have one more feature which allows searching multiple files at a time. We no need to use grep for each file. Suppose you want to search for Nathan in /root folder recursively use below example.

root@linuxnix:~# grep -r 'Nathan' /root/
 Nathan 20 Wipro Newyark

This will not display which file contain Nathan which may confuse you. We do not know from which file Nathan came. To avoid this confusion use below example.

Example 15: Search for a word and just list the file names which contains it with in a directory.

root@linuxnix:~# grep -l 'Nathan' /root/
 file1.txt

Example 16: Ok, again this command do not show the line which is again a confusion. In order to search multiple files and display their contents which matchs our search criteria use combination of -r and -n

root@linuxnix:~# grep -rn 'Nathan' /root/
 file1.txt:5:Nathan 20 Wipro Newyark
 test.txt:1:Nathan abc xyz who

Example 17: Restrict your search to specific files. Suppose search only txt files.

root@linuxnix:~# grep -rn 'Nathan' *.txt
 file1.txt:5:Nathan 20 Wipro Newyark
 test.txt:1:Nathan abc xyz who

Example 18: Some times you may see below error when opening log files.

Binary file <input-file> matches.

This error is because grep thinks it is a binary file. But our log files are never a binary one. This error is due to null value found in the log file. In order to read such files you have to use -a which tell grep to read this file as binary file.

grep -a xyz abc.txt

In our next two posts we will see how to use grep with regular expressions.