Grep is a command line tool used for searching ascii text files for data sets matching a regular expression. Grep was developed for the Unix operating system, but has since been adapted and distributed to all platforms including Linux, Windows, and Mac OS X.
Grep searches files specified as arguments, or a program's output when piped to the output of that command. By default, it reports matching lines on standard output, but specific modes of operation may be chosen with command line options.
A simple example of a common usage of grep is the following, which searches the file fruitlist.txt for lines containing the text string apple:
grep apple fruitlist.txt
Matches occur when the specific sequence of characters is recognized, for example, lines containing pineapple or apples are printed irrespective of word boundaries. However, the search pattern specified as an argument is case sensitive by default, so this example's output does not include lines containing Apple (with a capital A) unless they also contain apple. Case-insensitive matching occurs when the argument option -i (ignore case) is given.
When using grep against a program's output (for example, catting a file or checking the process list), the grep command returns all lines with the matching pattern:
[amcom@db1 ~]$ ps -ef | grep postfix root 3771 1 0 Jan14 ? 00:00:01 /usr/libexec/postfix/master postfix 3785 3771 0 Jan14 ? 00:00:00 qmgr -l -t fifo -u postfix 20638 3771 0 14:02 ? 00:00:00 pickup -l -t fifo -u amcom 20828 20753 0 14:13 pts/0 00:00:00 grep postfix
Multiple file names may be specified in the argument list. For example, all files having the extension .txt in a given directory may be searched if the shell supports globbing by using an asterisk as part of the filename:
grep apple *.txt
Regular expressions can be used to match more complicated text patterns. The following prints all lines in the file that begin with the letter a, followed by any one character, followed by the letter sequence ple.
grep ^a.ple fruitlist.txt
The name of grep derives from a usage in the Unix text editor "ed" and related programs. Before grep existed as a separate command, the same effect might have been achieved in an editor:
ed fruitlist.txt g/^a.ple/p q
where the second line is the command given to ed to print the relevant lines, and the third line is the command to exit from the editor.
Like most Unix commands, grep accepts options in the form of command-line arguments to change its behavior. For example, the option flag l (lower case L) provides a list of the files which have matching lines, rather than listing the lines explicitly.
Selecting all lines containing the self-standing word apple, i.e. surrounded by white space or hyphens, may be accomplished with the option flag w.
Exact line match is performed with the option flag x. Lines only containing exactly and solely apple are selected with a line-regexp instead of word-regexp:
cat fruitlist.txt apple apples pineapple apple- apple-fruit fruit-apple grep -x apple fruitlist.txt apple
The v (lower-case V) option inverts the sense of the match and prints all lines that do not contain apple, as in this example:
grep -v apple fruitlist.txt lemon lime strawberry banana pear peach orange mango coconut papaya watermelon
The c option does a count on the amount of times the expression appears in the file and outputs that count to the screen.
grep -c apple fruitlist.txt 6
How to grep a file for 2 expressions needing to match.
Find results for either A or B
cat fruitlist.txt | grep -P "\b(apple|fruit)\b" apple apples pineapple apple- apple-fruit fruit-apple orange-fruit fruit-orange
Find results for both A and B
cat fruitlist.txt | grep -P "\apple\b" | grep -P "\fruit\b" apple-fruit fruit-apple
Print results with leading (B) and trailing (A) number of lines before or after the matching line(s)
grep -B 5 -A 5 peach fruitlist.txt -- lime strawberry apple banana pear peach orange mango coconut papaya watermelon --