How to Use Grep Command to Find Text in Files

Linux and UNIX-like systems, all system configuration information is stored and manipulated in plain text form. So searching text would come very common task for editing and log analysis.

The grep command allows searching for a text or string in a file or from output console of a command, for a term or pattern matching regular expressions. When grep finds match in a line, it copies results into the screen ie stdout.

In this tutorial we learn how to use grep command with practical examples.

Grep Command 

Lets check grep command syntax before we start explaining its usage.

grep [OPTIONS] PATTERN [FILE...]

We will discuss in detail most common grep options and patterns we can use for searching.

How search a string in a file

In the below example grep searches the /etc/passwd file for the string 'root' and redirected output to stdout.

$ grep "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

Search text from multiple files

You can search specific text from multiple files using the following command:

$ grep "root" /etc/passwd /etc/group
/etc/passwd:root:x:0:0:root:/root:/bin/bash
/etc/passwd:operator:x:11:0:operator:/root:/sbin/nologin
/etc/group:root:x:0:root
/etc/group:bin:x:1:root,bin,daemon
/etc/group:daemon:x:2:root,bin,daemon
/etc/group:sys:x:3:root,bin,adm
/etc/group:adm:x:4:root,adm,daemon
/etc/group:disk:x:6:root
/etc/group:wheel:x:10:root

Grep case insensitive search

Options -i searches for the given string/pattern case insensitively.

In following examples grep matches all the words such as “hal”, “HAL” case insensitively:

$ grep -i HAL /etc/passwd
halt:x:7:0:halt:/sbin:/sbin/halt
haldaemon:x:68:68:HAL daemon:/:/sbin/nologin

Recursive Search

Recursive search is achieved by using -r option that will search Recursively all file skipping  symbolic links. If you want to include symlinks use -R.

In the following example, grep command will search for the string 'ngnix' in all files inside /var directory.

$ grep -r nginx /var

Search for a String in Command Output (stdout)

You can use pipe the output for a command and grep for the pattern from its output.

In the following example I am searching for a file with name 'backup' using the ls command

$ ls | grep backup

Here i am doing multiple pipe and searching for the 'docker' and 'apache' process from ps command.

$ ps -ef | grep docker | grep apache

Regular Expressions in files

Regular Expressions is a pattern to match for each input line. Basic and Extended are the two regular expression used by grep command.

Basic regular expression

By default, grep interprets the pattern as a basic regular expression.

The ^ (caret) symbol - The pattern following it must occur at the beginning of each line. In the following example, the string ^welcome will match only if it occurs at the very beginning of a line.

$ grep “^welcome” filename

Extended Regular Expression

Use -E ( or --extended-regexp) option if you want grep to understand it as an extended regular expression.

The following command will extract all links from an file

$ grep –Eoi '<a[^>]+>.*</a>' filename

o : By default, grep prints entire line which contains the search pattern. This option instructs grep command to print only the matching words instead of entire line.

i : This option ask grep command to ignore the case while matching the pattern.

Search a full word using grep

The -w (word-regexp) flag for grep will make the given expression match only whole words.

$ grep -iw "samba" /etc/samba/smb.conf
# This is the main Samba configuration file. You should read the
# here. Samba has a huge number of configurable options (perhaps too
# For a step to step guide on installing, configuring and using samba,
# read the Samba-HOWTO-Collection. This may be obtained from:

Display lines after the string match

The -A option which displays the N lines after the string match.

$ grep -A 2 "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

Display lines before the string match

We can use -B option to display N lines before the string for a given file

$ grep -B 2 "root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
--
news:x:9:13:news:/etc/news:
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

Search multiple strings

We can search multiple patterns or strings using OR operator | and \|-E  (extended-regexp) controls whether you need to escape certain special characters. -e is strictly the flag for indicating the pattern you want to match against.

Example 1: using -E option

$ ls | grep -E “li|ovo”
linux24
ovo8_linux24.sh

Or

$ grep -E "foo|bar" *.txt

Example 2: without -E

$ ls | grep ‘li\|ovo’
linux24
ovo8_linux24.sh

Or

$ grep "foo\|soul\|bar" *.txt

Exclude specific file from searching

You can use -v option to ignore searching. The following command will search the string 'error' in all files except 'syslog.log'

$ grep -r error * | grep -v ‘/\syslog.log/’

Conclusion

In this tutorial we learned how to use grep command to find text in files. I hope your enjoyed reading this and please leave your suggestions in the below comment section.

Bobbin Zachariah 7:25 pm

Comments

Your email address will not be published. Required fields are marked *

All comments are subject to moderation.