Learning Linux Basics Course & Labs

Working with Shell II

Searching for Files and Patterns

Whether you're a Linux system administrator or a casual shell user, efficiently locating files, directories, or specific text patterns is essential. This guide explores various command-line tools to search the Linux filesystem and file contents, providing examples, detailed explanations, and advanced options to enhance your workflow.


Using the locate Command

The locate command provides a fast way to find files by querying a pre-built database (mlocate.db). For example, to search for files named "City.txt" within a directory structure representing continents, countries, and cities, simply run:

locate City.txt
/home/michael/Africa/Egypt/Cairo/City.txt
/home/michael/Asia/India/Mumbai/City.txt

The command returns all paths that match the provided pattern quickly. However, if you have a freshly installed Linux system or if new files have been created recently, locate might not find them because the database is outdated.

Note

If the file isn't listed, update the database manually by running:

sudo updatedb

Then re-run the locate command.


Using the find Command

Unlike locate, the find command does not rely on a pre-built database and offers a highly versatile suite of options for searching. To locate a file named "City.txt" within the directory /home/michael, use:

find /home/michael -name City.txt
/home/michael/Africa/Egypt/Cairo/City.txt
/home/michael/Asia/India/Mumbai/City.txt

The find command is ideal for more granular searches, allowing you to locate files or directories by name, modification date, size, and other attributes.


Searching Within Files Using grep

The grep command is a powerful tool for searching text within files. It prints lines that match a specified pattern and is highly configurable.

Assume you have a file named sample.txt with the following content:

[~]$ cat sample.txt
This is the first line.
Followed by the second line.
And then the third line.
The fourth line has CAPITAL LETTERS
The fifth line does not want to be printed

To search for the word "second" in the file, simply run:

grep second sample.txt

This command prints only the line that contains the word "second." Remember, grep is case sensitive by default.

Case-Insensitive and Recursive Searches

For a case-insensitive search, add the -i flag:

grep -i capital sample.txt

To search recursively through a directory (for example, for the phrase "third line" in /home/michael), use the -R flag:

grep -R "third line" /home/michael
./sample.txt:And then the third line.

Excluding Matching Lines

To print only the lines that do not match a particular pattern, use the -v flag. For instance, to exclude lines containing "exam" from examples.txt:

grep -v exam examples.txt

This outputs all lines that do not contain the specified string.

Matching Whole Words

Consider a file named examples.txt with the following content:

[~]$ cat examples.txt
grep examples
linux exam on 19th

Running the following command:

grep exam examples.txt

will print both lines since "exam" is part of the word "examples" in the first line. To match only the whole word "exam", use the -w option:

grep -w exam examples.txt
linux exam on 19th

To reverse the search (i.e., print lines that do not contain the whole word "exam"), combine the -v and -w options:

grep -vw exam examples.txt
grep examples

This command prints only the line where the whole word "exam" is absent.

Printing Context with -A and -B Options

The -A (after) and -B (before) options allow you to display additional context around matching lines. Suppose you have a file named premier-league-table.txt:

[~]$ cat premier-league-table.txt
1 Arsenal
2 Liverpool
3 Chelsea
4 Manchester City

To print the line containing "Arsenal" along with the line immediately following it, run:

grep -A1 Arsenal premier-league-table.txt
1 Arsenal
2 Liverpool

Similarly, to print the line containing "4" and the preceding line, use the -B1 flag:

grep -B1 4 premier-league-table.txt
3 Chelsea
4 Manchester City

You can also combine both options to display one line before and one after a matching line. For example, to print one line before and after the line containing "Chelsea":

grep -A1 -B1 Chelsea premier-league-table.txt

This command provides helpful context around the matching line, making it easier to understand its surrounding content.


By mastering these commands, you can efficiently search files and patterns on Linux systems. Whether you're managing system files or scanning through logs and documents, these tools offer the flexibility and power you need to access the information quickly and accurately.
Explore more about these commands and their advanced options in the Linux Documentation.

Watch Video

Watch video content

Previous
File Compression and Archival