All skills
Skillintermediate
GNU grep Reference Guide
grep (Global Regular Expression Print) searches for patterns in text files. It's one of the most commonly used Unix tools.
Claude Code Knowledge Pack7/10/2026
Overview
GNU grep Reference Guide
Overview
grep (Global Regular Expression Print) searches for patterns in text files. It's one of the most commonly used Unix tools.
Official Manual: https://www.gnu.org/software/grep/manual/
Man Page: man grep
Basic Syntax
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] -e PATTERN ... [FILE...]
grep [OPTIONS] -f PATTERN_FILE ... [FILE...]
Common Options
Basic Options
-i, --ignore-case # Case-insensitive search
-v, --invert-match # Invert match (select non-matching lines)
-w, --word-regexp # Match whole words only
-x, --line-regexp # Match whole lines only
-c, --count # Count matching lines
-n, --line-number # Show line numbers
-H, --with-filename # Print filename with matches
-h, --no-filename # Suppress filename output
-l, --files-with-matches # Print only filenames with matches
-L, --files-without-match # Print only filenames without matches
Context Options
-A NUM, --after-context=NUM # Print NUM lines after match
-B NUM, --before-context=NUM # Print NUM lines before match
-C NUM, --context=NUM # Print NUM lines before and after
Regular Expression Options
-E, --extended-regexp # Use Extended Regular Expressions (ERE)
-F, --fixed-strings # Treat PATTERN as fixed strings, not regex
-G, --basic-regexp # Use Basic Regular Expressions (BRE) - default
-P, --perl-regexp # Use Perl-compatible regex (PCRE)
Output Options
-o, --only-matching # Print only matched parts
-q, --quiet, --silent # Suppress output, just return exit code
--color[=WHEN] # Colorize output (auto, always, never)
-s, --no-messages # Suppress error messages
File Selection
-r, --recursive # Recursive search
-R, --dereference-recursive # Recursive, following symlinks
--include=PATTERN # Search only files matching PATTERN
--exclude=PATTERN # Skip files matching PATTERN
--exclude-dir=PATTERN # Skip directories matching PATTERN
Common Usage Patterns
Basic Searches
# Simple string search
grep "error" logfile.txt
# Case-insensitive search
grep -i "error" logfile.txt
# Search for whole word
grep -w "error" logfile.txt
# Count matches
grep -c "error" logfile.txt
# Show line numbers
grep -n "error" logfile.txt
Multiple Files
# Search in multiple files
grep "pattern" file1.txt file2.txt
# Search in all txt files
grep "pattern" *.txt
# Recursive search
grep -r "pattern" /path/to/dir
# Recursive with file pattern
grep -r --include="*.log" "error" /var/log
Context Display
# Show 3 lines after match
grep -A 3 "error" logfile.txt
# Show 3 lines before match
grep -B 3 "error" logfile.txt
# Show 3 lines before and after
grep -C 3 "error" logfile.txt
Invert Match
# Show lines that DON'T contain pattern
grep -v "debug" logfile.txt
# Exclude multiple patterns
grep -v "debug\\|info" logfile.txt
Multiple Patterns
# Match any pattern (OR)
grep -e "error" -e "warning" file.txt
grep "error\\|warning" file.txt
# Match all patterns (AND) - requires pipeline
grep "error" file.txt | grep "critical"
File Selection
# List files containing match
grep -l "pattern" *.txt
# List files NOT containing match
grep -L "pattern" *.txt
# Recursive with excludes
grep -r --exclude-dir=".git" "pattern" .
grep -r --exclude="*.min.js" "pattern" .
Regular Expressions in grep
Basic Regular Expressions (BRE) - Default
# BRE Metacharacters (no escaping needed)
. # Any single character
^ # Start of line
$ # End of line
[...] # Character class
[^...] # Negated character class
* # Zero or more of previous
# BRE Metacharacters (MUST be escaped)
\\+ # One or more (requires \\)
\\? # Zero or one (requires \\)
\\{m,n\\} # Between m and n occurrences (requires \\)
\\(...\\) # Group (requires \\)
\\| # Alternation (requires \\)
BRE Examples
# Match lines starting with "Error"
grep "^Error" file.txt
# Match lines ending with "failed"
grep "failed$" file.txt
# Match any character
grep "a.c" file.txt # Matches abc, aXc, a5c
# Character class
grep "[0-9]" file.txt # Match any digit
grep "[A-Za-z]" file.txt # Match any letter
# One or more (escaped)
grep "a\\+b" file.txt # Matches ab, aab, aaab
# Groups and alternation (escaped)
grep "\\(error\\|warning\\)" file.txt
Extended Regular Expressions (ERE) - grep -E
# ERE - No escaping needed for +, ?, |, (), {}
+ # One or more
? # Zero or one
{m,n} # Between m and n occurrences
(...) # Group
| # Alternation
ERE Examples
# One or more (no escape)
grep -E "a+b" file.txt
# Zero or one
grep -E "colou?r" file.txt # Matches color or colour
# Alternation
grep -E "(error|warning)" file.txt
# Quantifiers
grep -E "[0-9]{3}-[0-9]{4}" file.txt # Phone: 123-4567
grep -E "[0-9]{1,3}" file.txt # 1 to 3 digits
# Groups
grep -E "(http|https)://[^ ]+" file.txt # URLs
Character Classes
POSIX Character Classes
[:alnum:] # Alphanumeric [A-Za-z0-9]
[:alpha:] # Alphabetic [A-Za-z]
[:digit:] # Digits [0-9]
[:lower:] # Lowercase [a-z]
[:upper:] # Uppercase [A-Z]
[:space:] # Whitespace [ \ \
\\r\\f\\v]
[:blank:] # Space and tab [ \ ]
[:punct:] # Punctuation
[:xdigit:] # Hex digits [0-9A-Fa-f]
[:word:] # Word characters [A-Za-z0-9_]
Usage
# Match any digit
grep "[[:digit:]]" file.txt
# Match any whitespace
grep "[[:space:]]" file.txt
# Match uppercase letters
grep "[[:upper:]]" file.txt
Practical Examples for Shell Scripts
Log File Analysis
# Find errors in last hour
grep "$(date -d '1 hour ago' '+%Y-%m-%d %H')" /var/log/app.log | grep -i error
# Count error types
grep -i "error" logfile.log | cut -d: -f2 | sort | uniq -c | sort -rn
# Extract IP addresses
grep -oE '\\b([0-9]{1,3}\\.){3}[0-9]{1,3}\\b' access.log
Configuration Validation
# Find uncommented lines in config
grep -v "^#" config.file | grep -v "^$"
# Check for specific settings
if grep -q "debug = true" config.ini; then
echo "Debug mode is enabled"
fi
Code Search
# Find function definitions
grep -n "^function " script.sh
# Find TODO comments
grep -rn "TODO" --include="*.sh" .
# Find unquoted variables (simple check)
grep -n '\\$[A-Za-z_][A-Za-z0-9_]*\\s' script.sh
Performance Tips
1. Use -F for Fixed Strings
# Faster when not using regex
grep -F "literal string" large_file.txt
2. Use -q When Only Checking Existence
# Don't need output, just exit code
if grep -q "pattern" file.txt; then
echo "Found"
fi
3. Limit Search Depth
# Don't recurse too deep
grep -r --max-depth=2 "pattern" /path
4. Exclude Unnecessary Directories
grep -r --exclude-dir={.git,.svn,node_modules} "pattern" .
Exit Codes
- 0: Match found
- 1: No match found
- 2: Error occurred
Common Pitfalls in Shell Scripts
1. Not Quoting Patterns with Spaces
# Wrong
grep $pattern file.txt
# Right
grep "$pattern" file.txt
2. Using grep in Tests Without -q
# Inefficient
if [ "$(grep pattern file)" ]; then
# Better
if grep -q pattern file; then
3. Useless Use of cat
# Wrong (UUOC)
cat file | grep pattern
# Right
grep pattern file
# or
< file grep pattern
4. Not Handling No Match Case
# grep returns 1 if no match, can cause set -e to exit
grep "pattern" file || true
# Or check explicitly
if grep -q "pattern" file; then
echo "Found"
else
echo "Not found"
fi
5. Forgetting to Escape Regex Metacharacters
# Wrong - . matches any character
grep "192.168.1.1" file
# Right - escape the dots
grep "192\\.168\\.1\\.1" file
# Or use -F for literal match
grep -F "192.168.1.1" file
Useful Combinations
# Case-insensitive recursive search with line numbers
grep -rni "pattern" /path
# Count total matches across files
grep -r "pattern" . | wc -l
# Find and highlight matches
grep --color=always "pattern" file.txt | less -R
# Search compressed files
zgrep "pattern" file.gz
# Search with extended regex and only show matches
grep -Eo "pattern" file.txt