简介
grep(Global Regular Expression Print)是一个强大的文本搜索工具,它使用正则表达式来查找文件中的匹配行。本指南将帮助您掌握grep的各种用法,从基本搜索到高级模式匹配。
主要特点:
- 支持基本和扩展正则表达式
- 可以递归搜索目录
- 支持多种输出格式
- 能够处理二进制文件
- 提供上下文显示
基础用法
基本语法
grep [选项] 模式 [文件...]
常用选项
选项 | 说明 | 示例 |
---|---|---|
-i | 忽略大小写 | grep -i "error" log.txt |
-r | 递归搜索目录 | grep -r "TODO" ./src/ |
-n | 显示行号 | grep -n "pattern" file.txt |
-v | 反向匹配 | grep -v "^#" config.conf |
基本用法示例:
在文件中搜索:
grep "error" log.txt
搜索多个文件:
grep "pattern" file1.txt file2.txt
使用通配符:
grep "pattern" *.log
正则表达式
基本正则表达式(BRE)
模式 | 说明 | 示例 |
---|---|---|
^ | 行首匹配 | grep "^ERROR" log.txt |
$ | 行尾匹配 | grep "end$" file.txt |
. | 任意单个字符 | grep "h.llo" file.txt |
* | 前一个字符零次或多次 | grep "ab*c" file.txt |
扩展正则表达式(ERE)
使用-E选项或egrep:
grep -E "pattern1|pattern2" file.txt
egrep "pattern1|pattern2" file.txt
高级特性
上下文显示
显示匹配行的前后文:
# 显示前后各2行
grep -C 2 "error" log.txt
# 只显示前2行
grep -B 2 "error" log.txt
# 只显示后2行
grep -A 2 "error" log.txt
递归搜索
搜索目录中的所有文件:
grep -r "pattern" /path/to/directory/
排除特定目录:
grep -r --exclude-dir={.git,node_modules} "TODO" ./
输出控制
只显示匹配的文件名:
grep -l "pattern" *.txt
显示匹配次数:
grep -c "error" log.txt
实用案例
日志分析
查找错误信息:
grep -i "error\|failed\|critical" /var/log/syslog
统计HTTP状态码:
grep -o 'HTTP/1.1" [0-9]*' access.log | sort | uniq -c
代码审查
查找TODO注释:
grep -r -n "TODO\|FIXME" ./src/
查找特定函数:
grep -r "function.*getData" ./
系统配置检查
检查开放端口:
netstat -tulpn | grep "LISTEN"
查找配置项:
grep -r "^[^#]*MaxConnections" /etc/
性能优化
搜索优化
优化建议:
- 使用--exclude和--exclude-dir排除不需要的文件和目录
- 使用-F进行固定字符串搜索
- 合理使用-l只显示文件名
- 避免使用过于复杂的正则表达式
常见性能陷阱
注意事项:
- 避免在大型二进制文件中搜索
- 使用--binary-files=without-match跳过二进制文件
- 大文件搜索时考虑使用ripgrep等现代工具
实用脚本
高效的日志搜索脚本:
#!/bin/bash
log_dir="/var/log"
pattern="$1"
exclude_dirs=".git|node_modules|cache"
grep -r \
--exclude-dir="{$exclude_dirs}" \
--binary-files=without-match \
-n "$pattern" \
"$log_dir"