grep(Global Regular Expression Print,全局正则表达式打印)是 Linux 系统中最常用、最强大的文本搜索工具之一。它能够在文件中搜索匹配指定模式的行,并将匹配的行输出。
一、基本语法
bash
grep [选项] "搜索模式" 文件名
二、最常用的参数
| 参数 | 说明 | 示例 |
|---|---|---|
-i |
忽略大小写 | grep -i "error" log.txt |
-v |
反向匹配(显示不匹配的行) | grep -v "DEBUG" log.txt |
-n |
显示行号 | grep -n "error" log.txt |
-c |
只显示匹配的行数 | grep -c "error" log.txt |
-l |
只显示匹配的文件名 | grep -l "error" *.txt |
-r或-R |
递归搜索目录 | grep -r "error" /var/log/ |
-w |
精确匹配整个单词 | grep -w "error" log.txt |
-A n |
显示匹配行及之后n行 | grep -A 3 "error" log.txt |
-B n |
显示匹配行及之前n行 | grep -B 2 "error" log.txt |
-C n |
显示匹配行及前后各n行 | grep -C 5 "error" log.txt |
-E |
使用扩展正则表达式(等同于egrep) | `grep -E "error |
-e |
指定多个匹配模式 | grep -e "error" -e "warn" log.txt |
--color |
高亮显示匹配内容 | grep --color "error" log.txt |
三、正则表达式用法
1.基本正则表达式(BRE)
BRE,Basic Regular Expression。
| 符号 | 说明 | 示例 |
|---|---|---|
^ |
匹配行首 | grep "^Start" file.txt |
$ |
匹配行尾 | grep "end$" file.txt |
. |
匹配任意单个字符 | grep "1.st" file.txt |
* |
匹配前一个字符0次或多次 | grep "ab*c" file.txt |
[] |
匹配字符集中的任意一个 | grep "[aeiou]" file.txt |
[^] |
匹配不在字符集中的字符 | grep "[^0-9]" file.txt |
\ |
转义字符 | grep "a\.b" file.txt |
2.扩展正则表达式(ERE,需用-E参数)
ERE,Extended Regular Expression。
| 符号 | 说明 | 示例 |
|---|---|---|
+ |
匹配前一个字符1次或多次 | grep -E "a+b" file.txt |
? |
匹配前一个字符0次或1次 | grep -E "colou?r" file.txt |
| ` | ` | 或运算 |
() |
分组 | grep -E "(ab)+" file.txt |
{n} |
匹配前一个字符n次 | grep -E "a{3}" file.txt |
{n,m} |
匹配前一个字符n到m次 | grep -E "a{2,4}" file.txt |
四、实际应用场景示例
1.日志分析
bash
# 查找日志中的错误信息(忽略大小写)
grep -i "error" /var/log/syslog
# 查找多个关键词
grep -E "error|warning|fail" /var/log/syslog
# 显示错误行及其前后5行(便于分析上下文)
grep -C 5 "error" application.log
# 统计错误出现的次数
grep -c "ERROR" application.log
2.代码搜索
bash
# 在当前目录递归搜索函数定义
grep -rn "function myFunc" ./
# 查找所有包含TODO的文件
grep -rl "TODO" ./src/
# 查找特定格式的代码(如邮箱)
grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" contacts.txt
# 查找空行
grep -n "^$" file.txt
3.系统管理
bash
# 查看已安装的软件包
dpkg -l | grep nginx
# 查看特定端口占用
netstat -tuln | grep ":80"
# 查看特定进程
ps aux | grep nginx
# 查看用户信息
grep "username" /etc/passwd
4.配置文件处理
bash
# 查看配置项(排除注释行)
grep -v "^#" config.conf
# 排除空行和注释行
grep -v -E "^#|^$" /etc/ssh/sshd_config
# 查找特定配置
grep "Port" /etc/ssh/sshd_config
五、组合使用技巧
常用组合拳
1.查找代码中的配置,排除掉 .git 文件夹
bash
grep -r "database" ./ --exclude-dir=".git"
2.实时监控日志报错
配合tail命令使用:
bash
tail -f app.log | grep "error"
3.统计某个关键词出现的频次
配合wc(word count)命令:
bash
grep -o "keyword" file.txt | wc -l
(注:-o表示只输出匹配的部分,每行一个,配合wc -l统计出现次数,而不是行数)
4.查找特定类型文件中的内容
配合find命令:
bash
find . -name "*.java" | xargs grep "import"
5.与管道配合
bash
# 查看内存使用并过滤
free -m | grep Mem
# 组合多个grep实现多级过滤
cat log.txt | grep "error" | grep -v "ignore"
# 查看磁盘使用并过滤
df -h | grep -v "tmpfs"
6.与 find 命令配合
bash
# 在特定类型文件中搜索
find /var/log -name "*.log" -exec grep -l "error" {} \;
# 搜索最近修改的文件中的内容
find . -mtime -1 -type f | xargs grep "pattern"
7.统计分析
bash
# 统计匹配行数并排序(简单记忆:-t指定分隔符,-k指定字段,-n数值排序,-r反序。)
grep -c "pattern" *.txt | sort -t: -k2 -nr
# 查找并统计IP访问次数(uniq去除相邻的重复行 -c显示每行出现的次数)
grep -oE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" access.log | sort | uniq -c | sort -nr
六、常用实用命令速查
bash
# 递归搜索当前目录,显示行号和文件名,忽略大小写
grep -rni "pattern" ./
# 只显示匹配的内容(不显示整行)
grep -o "[0-9]\{3\}-[0-9]\{4\}" file.txt
# 匹配整个单词,忽略大小写,显示行号
grep -win "error" log.txt
# 查找最近24小时内的错误
find /var/log -mtime -1 -type f -exec grep -l "error" {} \;
# 批量替换(配合sed)
grep -rl "old" ./ | xargs sed -i 's/old/new/g'
七、注意事项
- 特殊字符转义 :在正则表达式中,
$、*、[、]、^、|、(、)等字符有特殊含义,需要用\转义或使用-E参数(扩展正则表达式ERE)。 - 引号使用:搜索模式建议用引号包裹,避免 shell 解释特殊字符:
bash
grep "hello world" file.txt # 推荐
grep hello world file.txt # 可能出错
- 性能优化 :在大文件中搜索时,
-F(固定字符串匹配)比正则表达式更快:
bash
grep -F "literal string" bigfile.txt
- 二进制文件 :默认跳过二进制文件,使用
-a可将其视为文本处理。