Grep is a powerful UNIX command that lets you search inside the file contents on a variety of parameters. It's especially helpful when you are troubleshooting or debugging.
The grep command has a huge number of options and use cases. You probably will never need or use all of them. However, you'll end up using a handful of grep commands most of the time.
This article lists the most common grep commands with quick examples. Linux Handbook already has a detailed article on grep, so I won't go in depth here. I'll just the common options and their explanation here.
It's good if you are already familiar with the grep command but you keep forgetting which option does what.
|i||grep -i pattern file||Case insensitive search|
|A||grep -A n pattern file||Show n lines after the match|
|B||grep -B n pattern file||Show n lines before the match|
|C||grep -C n pattern file||Show n lines before and after the match|
|v||grep -v pattern file||Show lines that do not match|
|c||grep -c pattern file||Count number of matching lines|
|l||grep -l pattern file||Display only the file names|
|w||grep -w pattern file||Match the exact word|
|e||grep -e regex file||Match the regex pattern|
|a||grep -a pattern file||Search into binary files|
|r||grep -r pattern dir||Recursively search into directory|
I have included a PDF cheatsheet which you can download, print and keep on your desk.
Quick examples of the Grep command
You probably already know that to search for a particular text or pattern in a file, you have to use grep like this:
grep search_pattern filename
Let's see a few common use cases of the grep command.
Case insensitive search
By default, the search with grep is case-sensitive. You can ignore case matching with the
grep -i search_pattern filename
This way, grep will return lines that match both
Show lines before and after the matching lines
By default, you only see the matching lines. But when you are troubleshooting something, it helps to see a couple of lines before and/or after the matching lines.
You can use the
-A to show lines after the matching ones. Remember, A is for After.
The command below will show the matching lines along with the 5 lines after the match.
grep -A 5 search_pattern filename
Similarly, you can use the
-B option to show lines before the matching ones. Remember, B is for Before.
The command below will show 5 lines before the matching ones along with the matching line(s).
grep -B 5 search_pattern filename
My favorite is the option
-C because it shows lines that are before and after the matching ones. Remember, C here stands for Circle.
The command below will show 5 lines before the matching one, the matching line and 5 lines after the matching line.
grep -C 5 search_pattern filename
Show the lines that do not match
You can use grep to display all the lines that DO NOT match the given pattern. This 'invert matching' is used with the
grep -v search_pattern filename
You can combine
Count the number of matching lines
Instead of showing the matching lines, you can just get how many lines match the pattern with
-c option. This is lowercase c.
grep -c search_pattern filename
You can combine the
-v option to get the number of lines that do not match the given pattern. You can of course, use the case-insensitive option
Show line numbers of matching lines
To show the line numbers of the matching lines, you can use the
grep -n search_pattern filename
You can do the same with inverted search.
Search in multiple files
You may provide more than one file to grep to search into.
grep search_pattern file1 file2
That could work, but a more practical example is to search into a particular type of files. For example, if you want to look for a string in shell scripts only (files ending with .sh), you could use:
grep search_pattern *.sh
Search for all the files in a directory recursively
You can perform a recursive search with grep option
-r. It will search for the given pattern in all the files in the current directory and its subdirectories.
grep -r search_pattern directory_path
Display only the file names
By default, grep shows the matching lines. If you have run the search on several files and you only want to see which files contain the string, you can use the
grep -l search_pattern files_pattern
Say you want to see which Markdown files contain the word "handbook," you can use:
grep -l handbook *.md
Search for full word only
By default, grep will show any lines that contain the given string. You may not always want that. If you are searching for the word 'done,' it will also show lines that contain the words 'doner' or 'abandoned.'
To make grep search for full word only, you can use the option
grep -w search_string file
This way, if you search for the word 'done,' it will only show lines containing 'done,' not 'doner' or 'abandoned'.
Search for regex patterns
You can superpower your search by using a regex pattern. There is a dedicated option
-e that allows using regex pattern and option
-E that allows using extended regex patterns.
grep -e regex_pattern file
Search for this or that pattern
You can search for multiple patterns in the same grep search. If you want to see the lines that contain one pattern or the other, you can use the OR operator
|. However, you have to escape this special character in the following manner.
grep 'pattern1\|pattern' filename
You can use multiple patterns with the OR operator.
There is no specific option for the AND operator. You may use grep multiple times with pipe redirection for that.
Search binary files
Grep ignores binary files by default. You can make it search in binary files as if it was a text file using the
grep -a pattern binary_file
Download Grep command cheat sheet
You can bookmark this page for quickly referencing the grep command options and use cases.
You can also download this grep cheatsheet in PDF format, print it, and keep it at your desk to have a quick glance without losing time.
Let me know if you have any other common grep use case that you would like to see on this page.