The grep
command is primarily used to streamline and automate text processing and data extraction tasks.
System administrators and developers use grep
to search log files for specific entries, locate variables and functions within codebases, and detect system-related issues.
Learn about grep
syntax and usage scenarios through a set of practical examples.
Prerequisites
- Access to a command line/terminal window.
- A user with valid permissions to access the necessary files and directories.
What Is grep?
Grep is a Linux command-line tool that allows users to search files for a specified textual pattern. When grep
finds a match, it prints lines containing that pattern to the terminal.
By default, the grep
command outputs entire lines that contain the match. Users can utilize grep
options to include additional context around the match or show only matching parts of the line.
Note: A line in a text file is a sequence of characters followed by a line break.
grep Syntax
In its basic form, the grep
command consists of three parts:
- The
grep
command. - The pattern you are searching for.
- The file name through which
grep
searches.
The syntax is as follows:
grep '[search_pattern]' [file_name]
Single quotation marks ('
) are not mandatory for simple patterns without special characters or spaces, but it is good practice to use them.
For example, to search for the term cloud computing
in the example_file2.txt file, enter:
grep 'cloud computing' example_file2.txt
If the target file is not within the working directory, specify the file's full path:
grep 'cloud computing' /home/phoenixnap/Documents/example_file2.txt
grep
commands support multiple options, pattern variations, and file names. Users can combine as many options as necessary to get the needed results.
Note: Make sure to use the correct case when running grep
commands, as it is case-sensitive by default.
grep Options
The following table lists common grep
options. They allow users to perform complex actions, targeted searches, and automate many grep functionalities.
OPTION | DESCRIPTION |
---|---|
-i | The search ignores differences between uppercase and lowercase letters. |
-v | Display only lines that do not match the search pattern. |
-w | Match only whole words. |
-r or -R | Search through subdirectories for the pattern. -R also follows symbolic links. |
-x | Match only whole lines. |
-l | List files with the matching pattern only once. |
-L | List files that do not contain the pattern. |
-c | Count how many lines match the search pattern. |
-o | Display only the matching part of each line. |
-a | Search binary file as text. |
-m NUM | Stop searching a file after matching the following number (NUM) of lines. |
-A NUM | Show the following number (NUM) of lines after each matching line. |
-B NUM | Show the following number (NUM) of lines that precede each matching line. |
-C NUM | Show the following number (NUM) of lines around matching lines, combining the effects of -A and -B . |
-n | Show the line number for each matching line. |
-e or -E | Use extended regular expressions for complex patterns. |
-h | Don't show file names when searching multiple files. |
-q | Do not display results; only indicate if there were any matches. |
-s | Hide errors about files that can't be found or read. |
grep Examples
The following examples show how to apply grep
options and conduct searches more efficiently.
Search a File
Enter the following command to search a file for a specific character pattern:
grep 'bare metal' example_file2.txt
Replace bare metal
and example_file2.txt
with the search pattern and file you want to search.
By default, grep
prints every line from example_file2.txt that contains the pattern bare metal
.
Ignore Case in Grep Searches
grep
commands are case-sensitive. Use the -i
option to display both uppercase and lowercase results:
grep -i 'bare metal' example_file2.txt
The output contains lines with the pattern, regardless of the case.
Inverse Search
You can use grep
to print all lines that do not match a specific pattern. To invert the search, append -v
to the grep
command:
grep -v 'bare metal' example_file2.txt
The terminal prints all lines from the example_file2.txt that do not contain the bare metal
search criterion.
Search Multiple Files
To search multiple files, insert the filenames you want to search, separated by a space. In this example, the grep command searches for the word server
in example_file1.txt, example_file2.txt, and example_file3.txt:
grep 'server' example_file1.txt example_file2.txt example_file3.txt
The terminal prints the matching lines along with the file name where each match is found.
Append as many filenames as necessary. The terminal prints the corresponding line prefixed with the filename for every match grep finds.
Note: Learn how to use the xargs command with grep
to search for a string in a list of files.
Search All Files in Directory
To search all files in the current directory, use an asterisk (*
) instead of a filename at the end of a grep
command.
In this example, the search pattern is ransomware
:
grep 'ransomware' *
The system prints each line that contains the term ransomware
and the name of the file where the match is found.
Search for a String in Files with Specific Extensions
Use the asterisk (*
) wildcard to limit searches to files with certain extensions:
grep 'ransomware' *.txt
grep
searches for the ransomware
pattern in all files with a .txt extension within the current directory.
Find Whole Words Only
grep
allows you to search and print the results for whole words only. To search for the word server
in all files in the current directory, append -w
to the grep
command:
grep -w server *
This option ensures that only lines containing the exact word server
are printed, along with the names of the files in which they are found.
In this example, the output does not include lines containing the plural form servers
.
Search Subdirectories
To recursively search all files, including subdirectories, add the -r
operator to the grep
command:
grep -r phoenix *
The system prints matches for all files in the current directory and subdirectories, including the exact path with the filename. Use this option carefully, as searching for a common word across multiple directories can take time.
The -R
option enables you to follow symbolic links within directories and extend the search to linked files and directories.
Show Lines That Exactly Match a Search String
The grep
command prints entire lines when it finds a match in a file. Add the -x
option to print lines that completely match the search string:
grep -x 'Spoofing' example_file1.txt
The output displays lines that exactly match the search pattern only. If there are any other words or characters in the same line, grep
does not include them in the search results.
The image shows grep results without and with the -x
operator:
List Names of Matching Files
To retrieve the names of the files that contain a word or string of characters and exclude the actual lines, use the -l
operator:
grep -l 'server' *
The output shows the filenames that contain server
but does not print the corresponding lines.
grep
does not search subdirectories it encounters but may display warnings such as grep: temp: is a directory. Combine the recursive search operator -r
with -l
to include all subdirectories in your search.
Count Number of Matches
grep
can count how many lines contain a pattern in one or more files. Use the -c
operator to count the number of matching lines:
grep -c server *
The command displays the number of lines that contain the pattern server
for each file in the current directory.
Show Only the Matched Part of the Line
Use the -o
option to show only part of the line that matches the search pattern rather than the entire line:
grep -o 'server' example_file2.txt
This command displays only the parts of example_file2.txt that match the pattern.
Search in Binary Files
Use the grep
command with the -a
option to search for a string in a binary file:
grep -a 'string' binary_file1
The -a
option instructs grep
to treat the binary file as text.
Limit grep Output to a Fixed Number of Lines
Individual files, such as log files, can contain many matches for grep
search patterns. Limit the number of lines in the grep output by adding the -m
option and a number to the command:
grep -m3 'server' example_file2.txt
In this example, the terminal prints the first three matches it finds in the example_file2.txt file.
If you do not specify a file and search all files in a directory using the asterisk (*
), the output prints the number of results specified in the command from every file. The output also shows the filename that contains the matches.
Display Number of Lines Before or After a Search String
To add more context to grep search results, use the NUM
option.
The -A NUM
option displays a specified number of lines after a match. For example, the following command instructs grep
to print 2 additional lines after the matched pattern:
grep -A 2 'ransomware' example_file1.txt
The -B NUM
option displays lines before a match. The following command shows 2 additional lines before each ransomware
pattern match.
grep -B 2 'ransomware' example_file1.txt
The -C NUM
option displays the specified number of lines before and after the match. The following command shows 2 lines before and after the ransomware
match:
grep -C 2 'ransomware' example_file1.txt
Display Line Numbers with grep Matches
It is useful to see the line numbers when grep
finds multiple matches. Append the -n
option to any grep
command to show the line numbers.
Use the following command to show two lines before and after each match, along with their line numbers:
grep -n -C 2 ransomware example_file1.txt
The command example combines -n
for line numbers with -C 2
to display two lines before and after each match for the ransomware
pattern in example_file1.txt.
Search for Multiple Patterns
Use the -e
option to search for multiple patterns in a single grep command:
grep -e 'server' -e 'cloud computing' -e 'phoenix' example_file2.txt
Alternatively, use grep -E
(equivalent to the older egrep command) for a similar effect with extended regular expressions:
grep -E 'server|cloud computing|phoenix' example_file2.txt
In this example, grep
searches for lines that match server
, cloud computing
, and phoenix
in example_file2.txt.
Use of Regular Expressions in Searches
Users can append regular expressions to the grep
command to perform complex pattern matching. The following command searches example_file1.txt for lines that start with any letter:
grep '^[a-zA-Z]' example_file1.txt
Regular expressions like these are useful for filtering out empty lines or lines beginning with special characters or numbers.
Use grep with Pipes
grep
can be combined with other commands through piping (|
) for more complex searches or data processing.
In this example, the cat command is used to display the content of example_file2.txt and pipes it into grep
to filter lines that contain the search pattern:
cat example_file2.txt | grep 'server'
Piping enables you to perform advanced grep
search operations and interact with other command-line utilities.
Conclusion
After going through all the commands and examples, you know how to use grep
to search text files from the Linux terminal.
The grep
command has many more useful options and can be combined with the find command to search thousands of files at a time.