Grep

Regular Expressions

# Basic regex
grep "^[A-Z]" file.txt           # lines starting with uppercase
grep "[0-9]\{3\}" file.txt       # lines with 3 consecutive digits
grep "end$" file.txt             # lines ending with "end"

# Extended regex (-E)
grep -E "cat|dog" file.txt       # match cat OR dog
grep -E "go+d" file.txt          # match god, good, gooood...
grep -E "colou?r" file.txt       # match color or colour
grep -E "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b" file.txt

# Perl-compatible regex (-P)
grep -P "\d{3}-\d{4}" file.txt   # match phone-like patterns
grep -P "(?<=error: ).*" log.txt # lookbehind assertion

Context Lines

# Show N lines after match
grep -A 3 "pattern" file.txt

# Show N lines before match
grep -B 3 "pattern" file.txt

# Show N lines before and after
grep -C 3 "pattern" file.txt

# Show only matching part (-o) with context
grep -o -E "[0-9]+" file.txt     # extract all numbers

File Filtering

# Only show filenames with matches
grep -l "pattern" *.txt

# Only show filenames WITHOUT matches
grep -L "pattern" *.txt

# Search only specific file types
grep "pattern" *.py
grep "pattern" *.md

# Recursive with include/exclude
grep -r --include="*.{js,ts}" "pattern" .
grep -r --exclude="*.min.js" "pattern" .

Invert & Count

# Invert match (non-matching lines)
grep -v "pattern" file.txt

# Count matching lines
grep -c "pattern" file.txt

# Show line numbers
grep -n "pattern" file.txt

# Show only the matched parts
grep -o "pattern" file.txt

# Suppress error messages
grep -s "pattern" /root/*

Output Control

# Colorized output
grep --color=auto "pattern" file.txt

# Prefix with filename (useful with multiple files)
grep -H "pattern" *.txt

# No filename prefix
grep -h "pattern" *.txt

# Line number with byte offset
grep -b "pattern" file.txt

# Suppress prefix entirely (for piping)
grep -o "pattern" file.txt | sort | uniq -c | sort -rn

Advanced Patterns

# Email addresses
grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" file.txt

# IP addresses
grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" file.txt

# Hex color codes
grep -E "#[0-9a-fA-F]{6}" file.txt

# URL patterns
grep -E "https?://[^[:space:]]+" file.txt

# Empty lines
grep -E "^$" file.txt

# Duplicate consecutive lines
uniq -d file.txt

Practical Examples

# Find all TODO comments in a project
grep -rn "TODO\|FIXME\|HACK" --include="*.{py,js,ts,go}" .

# Search process output
ps aux | grep nginx

# Search command history
history | grep "docker"

# Find large files and filter
find / -type f -size +100M 2>/dev/null | grep -i log

# Extract HTTP status codes from access log
grep -oE " [0-9]{3} " access.log | sort | uniq -c | sort -rn

# Find files not matching a pattern
grep -rL "license" --include="*.py" .

# Count occurrences across files
grep -ro "function" --include="*.js" . | wc -l

基础搜索

# 在文件中搜索
grep "pattern" file.txt

# 忽略大小写
grep -i "pattern" file.txt

# 在多个文件中搜索
grep "pattern" file1.txt file2.txt

# 通过标准输入搜索
cat file.txt | grep "pattern"
echo "hello world" | grep "hello"

递归搜索

# 递归搜索目录
grep -r "pattern" /path/to/dir

# 跟随符号链接
grep -R "pattern" /path/to/dir

# 递归搜索并限定文件类型
grep -r --include="*.py" "pattern" /path/to/dir

# 排除目录
grep -r --exclude-dir={node_modules,.git} "pattern" .

# 排除文件类型
grep -r --exclude="*.log" "pattern" .

正则表达式

# 基本正则
grep "^[A-Z]" file.txt           # 以大写字母开头的行
grep "[0-9]\{3\}" file.txt       # 包含连续3个数字的行
grep "end$" file.txt             # 以 "end" 结尾的行

# 扩展正则 (-E)
grep -E "cat|dog" file.txt       # 匹配 cat 或 dog
grep -E "go+d" file.txt          # 匹配 god, good, gooood...
grep -E "colou?r" file.txt       # 匹配 color 或 colour

# Perl 兼容正则 (-P)
grep -P "\d{3}-\d{4}" file.txt   # 匹配电话号码格式
grep -P "(?<=error: ).*" log.txt # 后顾断言

上下文行

# 显示匹配行后 N 行
grep -A 3 "pattern" file.txt

# 显示匹配行前 N 行
grep -B 3 "pattern" file.txt

# 显示匹配行前后各 N 行
grep -C 3 "pattern" file.txt

# 仅显示匹配部分
grep -o -E "[0-9]+" file.txt     # 提取所有数字

文件过滤

# 仅显示包含匹配的文件名
grep -l "pattern" *.txt

# 仅显示不包含匹配的文件名
grep -L "pattern" *.txt

# 搜索指定文件类型
grep "pattern" *.py
grep "pattern" *.md

# 递归搜索时包含/排除
grep -r --include="*.{js,ts}" "pattern" .
grep -r --exclude="*.min.js" "pattern" .

反转与计数

# 反转匹配 (显示不匹配的行)
grep -v "pattern" file.txt

# 统计匹配行数
grep -c "pattern" file.txt

# 显示行号
grep -n "pattern" file.txt

# 仅显示匹配部分
grep -o "pattern" file.txt

# 抑制错误信息
grep -s "pattern" /root/*

搜索选项

# 全词匹配
grep -w "error" file.txt         # 匹配 "error" 不匹配 "errors"

# 整行精确匹配
grep -x "exact line" file.txt

# 固定字符串 (不解析正则)
grep -F ".*" file.txt            # 字面匹配 .*

# 将二进制文件当作文本处理
grep -a "pattern" binary_file

# 搜索压缩文件
zgrep "pattern" file.gz

输出控制

# 彩色输出
grep --color=auto "pattern" file.txt

# 显示文件名前缀 (多文件时有用)
grep -H "pattern" *.txt

# 不显示文件名前缀
grep -h "pattern" *.txt

# 显示字节偏移量
grep -b "pattern" file.txt

# 提取匹配内容并统计排序
grep -o "pattern" file.txt | sort | uniq -c | sort -rn

高级模式

# 邮箱地址
grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" file.txt

# IP 地址
grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" file.txt

# 十六进制颜色值
grep -E "#[0-9a-fA-F]{6}" file.txt

# URL 模式
grep -E "https?://[^[:space:]]+" file.txt

# 空行
grep -E "^$" file.txt

实用示例

# 查找项目中的 TODO 注释
grep -rn "TODO\|FIXME\|HACK" --include="*.{py,js,ts,go}" .

# 搜索进程
ps aux | grep nginx

# 搜索命令历史
history | grep "docker"

# 提取访问日志中的 HTTP 状态码并统计
grep -oE " [0-9]{3} " access.log | sort | uniq -c | sort -rn

# 查找不包含 license 的文件
grep -rL "license" --include="*.py" .

# 统计 JS 文件中 function 出现次数
grep -ro "function" --include="*.js" . | wc -l