+
sqlite
+
crystal
ubuntu
lua
play
groovy
+
+
saml
+
grpc
gin
+
+
+
+
scala
=
+
pnpm
+
+
+
+
{}
+=
+
+
echo
+
lisp
go
rb
packer
micronaut
weaviate
+
+
babel
+
r
+
+
sse
+
<-
+
+
+
+
+
sql
+
+
jwt
+
perl
+
bitbucket
haiku
+
supabase
+
+
grpc
weaviate
websocket
+
scipy
+
dask
babel
jasmine
+
+
ocaml
+
julia
vb
argocd
atom
+
abap
jwt
+
+
Back to Blog
How to Use Grep Command in Linux with Practical Examples 🔍
linux grep command-line

How to Use Grep Command in Linux with Practical Examples 🔍

Published Mar 5, 2025

Master the grep command in Linux with practical examples. Learn pattern matching, regular expressions, and advanced grep techniques for efficient text searching.

16 min read
0 views
Table of Contents

How to Use Grep Command in Linux with Practical Examples

The grep command (Global Regular Expression Print) is one of the most powerful text-searching tools in Linux. Learn how to harness its full potential with practical examples! 🔍

What is Grep?

Grep searches for patterns in files or input streams and prints matching lines. It’s an essential tool for:

  • Log file analysis
  • Code searching
  • Configuration file debugging
  • Data extraction
  • System administration

Basic Grep Syntax

grep [options] pattern [file...]

# Basic examples
grep "error" logfile.txt
grep -i "warning" *.log
grep -r "TODO" ./src/

Basic Pattern Matching

# Search for exact text
grep "hello" file.txt

# Case-insensitive search
grep -i "hello" file.txt

# Search in multiple files
grep "error" file1.txt file2.txt file3.txt

# Search all files in directory
grep "pattern" *

# Search specific file types
grep "function" *.js

Line Numbers and Context

# Show line numbers
grep -n "error" logfile.txt

# Show lines before match (Before context)
grep -B 3 "error" logfile.txt

# Show lines after match (After context)
grep -A 3 "error" logfile.txt

# Show lines before and after (Context)
grep -C 3 "error" logfile.txt

# Example output with context
grep -C 2 "failed" system.log
# 122: INFO: Process started
# 123: INFO: Loading configuration
# 124: ERROR: Connection failed
# 125: INFO: Retrying connection
# 126: INFO: Cleanup initiated

Counting and Listing

# Count matching lines
grep -c "error" logfile.txt

# List only filenames with matches
grep -l "TODO" *.py

# List filenames without matches
grep -L "copyright" *.java

# Show only the matched part
grep -o "error.*failed" logfile.txt

Regular Expressions

Basic Regular Expressions (BRE)

# Anchor patterns
grep "^Start" file.txt          # Lines starting with "Start"
grep "end$" file.txt           # Lines ending with "end"
grep "^complete$" file.txt     # Lines containing only "complete"

# Character classes
grep "[0-9]" file.txt          # Lines with digits
grep "[a-zA-Z]" file.txt       # Lines with letters
grep "[^0-9]" file.txt         # Lines with non-digits

# Wildcards
grep "col.r" file.txt          # . matches any single character
grep "error.*failed" file.txt  # .* matches any characters

# Repetition
grep "ab\+" file.txt           # One or more 'b' after 'a'
grep "ab\?" file.txt           # Zero or one 'b' after 'a'
grep "a\{3\}" file.txt         # Exactly 3 'a's
grep "a\{2,4\}" file.txt       # Between 2 and 4 'a's

Extended Regular Expressions (ERE)

# Use -E for extended regex
grep -E "error|warning|critical" logfile.txt

# Grouping
grep -E "(error|fail).*system" logfile.txt
grep -E "version [0-9]+\.[0-9]+" file.txt

# Repetition (no backslashes needed)
grep -E "ab+" file.txt         # One or more 'b'
grep -E "ab?" file.txt         # Zero or one 'b'
grep -E "a{3}" file.txt        # Exactly 3 'a's

# Word boundaries
grep -E "\berror\b" file.txt   # Whole word "error"

Perl-Compatible Regular Expressions (PCRE)

# Use -P for PCRE (if available)
grep -P "\d{3}-\d{3}-\d{4}" contacts.txt    # Phone numbers
grep -P "\b\w+@\w+\.\w+\b" emails.txt      # Email addresses
grep -P "(?<=price:)\s*\d+" prices.txt      # Positive lookbehind

# Non-greedy matching
grep -P "<.*?>" file.html                    # Minimal HTML tag match

Practical Examples

Log File Analysis

# Find all errors in logs
grep -i "error" /var/log/syslog

# Find errors in last 24 hours
grep "$(date '+%b %d')" /var/log/syslog | grep -i "error"

# Track specific process
grep "nginx" /var/log/syslog | grep -E "error|warning"

# Find failed login attempts
grep "Failed password" /var/log/auth.log

# Extract IP addresses from logs
grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" access.log

Code Searching

# Find TODO comments
grep -rn "TODO\|FIXME" --include="*.py" .

# Find function definitions
grep -E "^[[:space:]]*def\s+\w+\s*\(" *.py

# Find class definitions
grep -E "^class\s+[A-Z]\w*" *.java

# Find import statements
grep -E "^import\s+|^from\s+.*import" *.py

# Find specific function calls
grep -rn "mysqli_query\s*(" --include="*.php" .

Configuration File Debugging

# Find non-comment lines
grep -v "^#" config.conf | grep -v "^$"

# Find specific settings
grep -E "^(host|port|user)=" database.conf

# Check for duplicate entries
grep -E "^\s*[^#]" config.conf | sort | uniq -d

# Find lines with specific values
grep -E "timeout\s*=\s*[0-9]+" server.conf

System Administration

# Find users with bash shell
grep "/bin/bash$" /etc/passwd

# Find services listening on ports
netstat -tuln | grep "LISTEN"

# Find large files
find / -size +100M 2>/dev/null | grep -v "^/proc"

# Check for specific packages
dpkg -l | grep -i "apache"

# Monitor real-time logs
tail -f /var/log/syslog | grep --line-buffered "error"

Advanced Grep Techniques

Recursive Searching

# Basic recursive search
grep -r "pattern" /path/to/directory

# Recursive with file type filtering
grep -r --include="*.txt" "pattern" .

# Exclude certain directories
grep -r --exclude-dir={.git,node_modules} "pattern" .

# Exclude certain files
grep -r --exclude="*.log" "pattern" .

# Follow symbolic links
grep -r -L "pattern" /path

Working with Binary Files

# Search binary files as text
grep -a "pattern" binary_file

# Skip binary files
grep -I "pattern" *

# Show binary file matches
grep -l "pattern" * | file -f - | grep -v text

Performance Optimization

# Use fixed strings for literal searches (faster)
grep -F "exact string" large_file.txt

# Limit search depth
grep -r --max-depth=2 "pattern" .

# Use null character as delimiter
find . -name "*.log" -print0 | xargs -0 grep "error"

# Parallel grep with GNU parallel
find . -name "*.log" | parallel grep "pattern" {}

Combining Grep with Other Commands

Pipe Combinations

# Find and count unique IP addresses
grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" access.log | sort | uniq -c

# Process listing with filtering
ps aux | grep -v grep | grep "apache"

# Find files and search content
find . -name "*.conf" -exec grep -l "localhost" {} \;

# Search compressed files
zgrep "pattern" file.gz
bzgrep "pattern" file.bz2

# Search across multiple log files
cat /var/log/*.log | grep -i "error" | sort | uniq

Script Integration

#!/bin/bash
# Log analysis script

LOG_FILE="/var/log/application.log"
ERROR_COUNT=$(grep -c "ERROR" "$LOG_FILE")
WARNING_COUNT=$(grep -c "WARNING" "$LOG_FILE")

echo "Log Analysis Report"
echo "==================="
echo "Errors: $ERROR_COUNT"
echo "Warnings: $WARNING_COUNT"

# Extract error details
if [ $ERROR_COUNT -gt 0 ]; then
    echo -e "\nRecent Errors:"
    grep -A 2 "ERROR" "$LOG_FILE" | tail -20
fi

Grep Alternatives and Variants

Other Grep Tools

# egrep (deprecated, use grep -E)
egrep "pattern1|pattern2" file.txt

# fgrep (deprecated, use grep -F)
fgrep "literal string" file.txt

# ripgrep (rg) - faster alternative
rg "pattern" --type python

# silver searcher (ag)
ag "pattern" --python

# ack - designed for programmers
ack --python "pattern"

When to Use Alternatives

  1. ripgrep (rg): Extremely fast, respects .gitignore
  2. ag: Fast, good for code searching
  3. ack: No setup needed, good defaults for code
  4. grep: Universal availability, POSIX compliance

Common Grep Patterns

Email Validation

grep -E "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$" emails.txt

URL Extraction

grep -oE "https?://[a-zA-Z0-9./?=_-]*" file.txt

IP Address Matching

# Simple IP pattern
grep -E "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" file.txt

# Valid IP range (more complex)
grep -E "\b((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b" file.txt

Phone Numbers

# US phone format
grep -E "^\(?[0-9]{3}\)?[-. ]?[0-9]{3}[-. ]?[0-9]{4}$" contacts.txt

Date Patterns

# YYYY-MM-DD format
grep -E "[0-9]{4}-[0-9]{2}-[0-9]{2}" dates.txt

# DD/MM/YYYY or MM/DD/YYYY
grep -E "[0-9]{1,2}/[0-9]{1,2}/[0-9]{4}" dates.txt

Troubleshooting and Tips

Common Issues

# Issue: Binary file matches
# Solution: Use -a or -I
grep -a "pattern" file.bin

# Issue: Too many results
# Solution: Be more specific
grep -w "error" file.txt  # Whole word only

# Issue: Special characters in pattern
# Solution: Escape or use -F
grep -F "cost: $50.00" prices.txt

# Issue: Permission denied
# Solution: Use sudo or adjust search path
sudo grep -r "pattern" /etc/ 2>/dev/null

Performance Tips

  1. Use Fixed Strings: -F flag for literal searches
  2. Limit Scope: Search specific file types
  3. Avoid Backtracking: Write efficient regex
  4. Use Appropriate Tool: Consider ripgrep for large codebases

Best Practices

  1. Quote Patterns: Prevent shell interpretation

    grep "$SEARCH_TERM" file.txt
  2. Use Long Options: For clarity in scripts

    grep --recursive --ignore-case --line-number "pattern" .
  3. Check Exit Status: For scripting

    if grep -q "error" logfile.txt; then
        echo "Errors found!"
    fi

Conclusion

The grep command is an indispensable tool for Linux users. From simple text searches to complex pattern matching, grep provides the flexibility and power needed for efficient text processing.

Key takeaways:

  • Master basic patterns before moving to complex regex
  • Use appropriate flags for your use case
  • Combine grep with other tools for powerful pipelines
  • Consider alternatives for specific scenarios
  • Practice with real-world examples

Keep this guide handy as a reference for your grep adventures! 🔍