[Linux] Efficiently Searching and Extracting Patterns with the grep Command

目次

Overview

The grep command is a powerful utility used to search for specific string patterns or regular expressions within files or standard input. It serves as the foundation for text processing in Linux environments, commonly used for auditing system logs, verifying configuration settings, and searching for keywords within source code.

Specifications (Arguments and Options)

Syntax

BASH

grep [options] [pattern] [file_name...]

Major Options

OptionDescription
-EUses Extended Regular Expressions (ERE).
-FTreats the pattern as a fixed string, disabling regular expressions.
-PUses Perl-Compatible Regular Expressions (PCRE).
-A [num]Displays the specified number of lines after each match.
-B [num]Displays the specified number of lines before each match.
-C [num]Displays the specified number of lines before and after each match.
-e [pattern]Explicitly specifies the search pattern (allows multiple patterns).
-f [file]Reads search patterns from a specified file.
-cCounts only the number of matching lines.
–colorHighlights the matching strings in the output.
-HDisplays the filename for each match when searching multiple files.
-hSuppresses the display of filenames in the search results.
–label=[string]Assigns a custom label name to results from standard input.
-lDisplays only the names of files that contain matches.
-LDisplays only the names of files that do not contain matches.
-iIgnores case distinctions (case-insensitive search).
-wMatches only when the pattern is a complete word.
-xMatches only when the pattern matches the entire line exactly.
-nDisplays the line number for each matching line.
-m [num]Stops reading a file after the specified number of matches.
-oDisplays only the specific part of the line that matches the pattern.
-r, -RRecursively searches all files within the specified directory.
-vInverts the match, displaying only lines that do not match the pattern.
–exclude=[pattern]Skips files that match the specified pattern.
–exclude-dir=[DIR]Skips the specified directory during recursive searches.

Basic Usage

In this scenario, we audit a simulated user directory to find lines containing the specific username “mori.”

BASH

# Search for the string "mori" in the user list and display line numbers
grep -n "mori" /home/mori/documents/user_list.txt

TEXT

12:mori_administrator:active
45:backup_mori_agent:inactive
102:team_lead_mori:active

Practical Commands

The following scenario demonstrates how to extract only active configuration settings from an application environment file by filtering out comments and empty lines.

BASH

# Exclude lines starting with "#" (^#) and empty lines (^$) to show the first 4 settings
grep -v -e "^#" -e "^$" /etc/mori-app/server.conf | head -n 4

# Search for "error" in all files within a directory (case-insensitive, recursive)
grep -riH "error" /var/log/mori-services/

TEXT

LOG_LEVEL=DEBUG
LISTEN_PORT=8080
MAX_CONNECTIONS=100
RETRY_INTERVAL=30
/var/log/mori-services/app.log:2026-01-26 14:00:01 ERROR Connection failed
/var/log/mori-services/db.log:2026-01-26 14:05:10 [ERROR] SQL Timeout

Customization Points

When defining search patterns, using the caret (^) at the beginning signifies a match at the start of a line, while a dollar sign ($) signifies a match at the end. For improved readability when using multiple conditions separated by a pipe (|), utilize the -E option to avoid excessive backslash escaping. If you need to understand the context of a log error, use the -C option (e.g., -C 3) to extract surrounding lines for better situational analysis.

Important Notes

Standard grep does not treat characters like | or + as meta-characters unless you use the -E option or escape them with a backslash. When performing recursive searches on large directories, always use the –exclude-dir option to bypass unnecessary folders like log backups, as failing to do so can significantly degrade performance. Additionally, always enclose your search patterns in single or double quotes to prevent the shell from misinterpreting special characters or spaces.

Advanced Applications

The following examples demonstrate how to search for multiple variations of a name while excluding specific file types, and how to count users based on their login shell.

BASH

# Search for "mori" or "Mori" recursively while ignoring .bak files
grep -ri "mori" --exclude="*.bak" /etc/config/projects/

# Count the number of users whose login shell ends with /bin/bash
grep -c "/bin/bash$" /etc/passwd

TEXT

/etc/config/projects/setup.conf:Owner=mori
/etc/config/projects/env.json:  "Author": "Mori Taro"
5

Summary

The grep command is a versatile tool capable of everything from simple keyword lookups to advanced filtering using complex regular expressions. By effectively combining options like -v for exclusions, -E for extended syntax, and –exclude for efficient target management, you can rapidly extract only the most critical information from vast amounts of data. It is essential to select options that match your specific search goals while maintaining security by avoiding resource-heavy directory scans and preventing sensitive data from being recorded in terminal logs.

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次