一、基础用法:快速上手
1. 核心语法
grep [OPTIONS] PATTERN [FILE...]
2. 必知必会操作
搜索文件中内容:
grep "error" app.log # 在 app.log 中查找包含 "error" 的行
多文件搜索:
grep "404" access.log error.log # 同时在两个文件中搜索
忽略大小写:
grep -i "warning" syslog # 匹配 "WARNING"、"warning" 等
显示匹配行号:
grep -n "TODO" code.py # 输出格式:文件名:行号:内容
统计匹配次数:
grep -c "GET" access.log # 输出匹配的行数(非总匹配次数!)
- *
二、递归搜索与文件过滤
1. 递归搜索目录
grep -r "config" /etc/ # 搜索 /etc/ 下所有文件中的 "config"
2. 精准控制搜索范围
仅搜索特定文件类型:
grep -r --include="*.conf" "port" /etc/ # 只搜索 .conf 文件
排除特定文件/目录:
grep -r --exclude="*.tmp" "debug" . # 排除 .tmp 文件 grep -r --exclude-dir=".git" "TODO" . # 排除 .git 目录
多条件过滤:
grep -r --include="*.{js,css}" --exclude="*.min.*" "color" ./src # 搜索 js/css 文件,排除 min 文件
- *
三、输出控制与上下文
1. 高亮显示匹配内容
grep --color=auto "error" app.log # 自动高亮(通常可设为默认别名)
2. 显示上下文行
显示匹配行前后内容:
grep -A 3 "panic" syslog # 显示匹配行及其后3行(After) grep -B 2 "timeout" debug.log # 显示匹配行及其前2行(Before) grep -C 2 "crash" crash.log # 显示匹配行及其前后各2行(Context)
分页查看(保留颜色) :
grep --color=always "error" app.log | less -R # 按页查看,支持颜色
3. 仅输出匹配内容
grep -o "user_[0-9]+" logs.txt # 只输出 "user_123" 这样的匹配项,每项一行
4. 静默模式(脚本中使用)
if grep -q "success" status.txt; then
echo "任务完成!"
fi
四、正则表达式高级技巧
1. 基础正则表达式(BRE)
锚定行首/行尾:
grep "^start" file.txt # 匹配以 "start" 开头的行 grep "end$" file.txt # 匹配以 "end" 结尾的行
匹配任意字符:
grep "f.x" file.txt # 匹配 "fox"、"fix"、"f3x" 等
字符集合:
grep "[aeiou]" words.txt # 匹配包含元音字母的行 grep "[^0-9]" data.txt # 匹配包含非数字字符的行
2. 扩展正则表达式(ERE)
grep -E "(error|warn)" app.log # 匹配 "error" 或 "warn"
grep -E "[0-9]{3}-[0-9]{4}" contacts.txt # 匹配电话号码(如 123-4567)
3. Perl兼容正则(PCRE,需 GNU grep)
grep -P "\b\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}\b" access.log # 匹配IP地址
grep -P "\d+(?= ms)" ping.log # 正向预查(匹配 "123 ms" 中的 123)
4. 特殊符号转义
grep "http://example.com" file.txt # 转义特殊字符 / 和 .
grep -F ".*$special[char]" file.txt # -F 禁用正则,按字面搜索
五、高级实战技巧
1. 反向匹配(排除模式)
grep -v "200" access.log # 排除状态码为200的行
grep -v "^#" /etc/nginx/nginx.conf # 排除注释行(以#开头)
2. 多模式组合搜索
grep -e "error" -e "critical" app.log # 匹配包含 error 或 critical 的行
grep -E "error|(warning.*failed)" log # 组合复杂逻辑
3. 处理二进制文件
grep -a "text_in_binary" binary.data # 强制以文本方式处理二进制文件
strings binary.exe | grep "version" # 结合 strings 提取二进制文件中的文本
4. 提取结构化数据
提取邮箱地址:
grep -Eo "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Za-z]{2,}\b" userdata.txt
提取URL:
grep -Eo "https?://[a-zA-Z0-9./?=_-]+" webpage.html
5. 进程过滤技巧
ps aux | grep "[n]ginx" # 查找 nginx 进程(避免显示 grep 自身)
pgrep -f "java.*spring" | xargs ps -fp # 结合 pgrep 精确过滤进程
六、性能优化与陷阱
1. 加速大文件搜索
grep -m 100 "error" large.log # 找到100个匹配后停止
LC_ALL=C grep "pattern" bigfile # 禁用本地化,加速ASCII搜索
2. 避免内存爆炸
grep "pattern" huge.log | head -n 50 # 仅显示前50条结果(不加载整个文件)
3. 排除干扰
grep -s "error" *.log # 忽略文件不存在或无权限的报错
grep -d skip "config" /dev/* # 跳过设备文件等特殊文件
4. 结合 find
高效搜索
find /var/log -name "*.log" -exec grep -H "error" {} + # 快速搜索所有 .log 文件
find . -type f -mtime -7 | xargs grep "debug" # 搜索最近7天修改过的文件
七、冷门但实用的技巧
1. 多行匹配(需 GNU grep)
grep -Pzo "start(\n.*)+end" file.txt # 匹配从 start 到 end 的多行内容
2. 仅匹配完整单词
grep -w "word" file.txt # 匹配 "word" 而不是 "password"
3. 统计所有匹配项总数
grep -o "error" app.log | wc -l # 统计 "error" 出现的总次数
4. 压缩文件搜索
zgrep "error" /var/log/syslog.*.gz # 直接搜索 gzip 压缩文件
八、场景化案例
案例1:日志分析
# 查找过去1小时内包含 "timeout" 的错误,显示上下文
grep -C 2 "timeout" /var/log/app/$(date +"%Y-%m-%d").log
案例2:代码审查
# 搜索所有 Python 文件中的密码硬编码(排除测试目录)
grep -rn --include="*.py" --exclude-dir="tests" "PASSWORD =" ./src
案例3:网络诊断
# 提取访问量最高的10个IP地址
grep -oP "\d+.\d+.\d+.\d+" access.log | sort | uniq -c | sort -nr | head
九、终极组合技
1. 与 awk
联动
grep "500" access.log | awk '{print $1, $7}' # 提取IP和请求路径
2. 与 sed
联动
grep "user_id=" debug.log | sed 's/.*user_id=([0-9]+).*/\1/' # 提取用户ID
3. 批量替换前检查
grep -rl "old_string" . | xargs sed -i 's/old_string/new_string/g' # 先检查再替换
掌握这些技巧后,你将能应对 99% 的文本搜索需求。最后两个建议:
- 多用
man grep
:查看所有选项和细节。 - 动手实验:在测试文件上尝试不同组合,观察结果!
附:常用选项速查表
选项 | 作用 |
---|---|
-i | 忽略大小写 |
-v | 反向匹配 |
-r | 递归搜索 |
-l | 仅显示文件名 |
-n | 显示行号 |
-C | 显示上下文行 |
-P | Perl正则(GNU特有) |
-E | 扩展正则 |
-F | 固定字符串匹配 |
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。