grep
(Global Regular Expression Print) 是Linux/Unix系统中最常用和最强大的文本搜索工具之一。它能够在一个或多个文件中搜索指定的模式(字符串或正则表达式),并将包含该模式的行打印出来。
1. 基本语法
grep [选项] '模式' 文件名...
2. 基础用法示例
示例 1:在文件中搜索字符串
# 在文件 example.txt 中搜索包含 "error" 的行
grep 'error' example.txt
示例 2:搜索多个文件
# 在所有 .log 文件中搜索 "failed"
grep 'failed' *.log
示例 3:忽略大小写搜索
# 搜索 "Error"、"error"、"ERROR" 等
grep -i 'error' system.log
示例 4:显示行号
# 显示匹配行的行号
grep -n 'warning' app.log
示例 5:只显示匹配的文件名
# 只输出包含匹配项的文件名
grep -l 'success' *.txt
示例 6:显示不匹配的行(反向搜索)
# 显示不包含 "debug" 的所有行
grep -v 'debug' log.txt
示例 7:统计匹配行的数量
# 统计包含 "error" 的行数
grep -c 'error' server.log
示例 8:递归搜索目录
# 在当前目录及其子目录中搜索所有包含 "TODO" 的文件
grep -r 'TODO' .
示例 9:使用正则表达式
# 搜索以 "Error:" 开头的行
grep '^Error:' error.log
# 搜索以 "end" 结尾的行
grep 'end$' data.txt
# 搜索包含数字的行
grep '[0-9]' numbers.log
示例 10:使用扩展正则表达式(ERE)
# 使用 -E 支持更复杂的正则
grep -E 'error|warning|fail' log.txt # 匹配 error 或 warning 或 fail
# 匹配连续两个或更多数字
grep -E '[0-9]{2,}' data.txt
示例 11:只显示匹配的部分(高亮)
# 只显示匹配的文本部分(通常自动高亮)
grep --color=always 'critical' alert.log
示例 12:精确匹配单词
# 只匹配完整的单词 "root",不匹配 "bootstrap"
grep -w 'root' users.txt
示例 13:结合管道使用
# 列出所有进程,并筛选出包含 "nginx" 的行
ps aux | grep nginx
# 查看磁盘使用情况,筛选出根分区信息
df -h | grep '/$'
示例 14:搜索固定字符串(不解析正则)
# 搜索包含 "$HOME" 的行,不把 $ 当作正则符号
grep -F '$HOME' config.sh
示例 15:同时使用多个条件
# 搜索同时包含 "error" 和 "database" 的行(使用管道)
grep 'error' log.txt | grep 'database'
# 或者使用正则
grep 'error.*database\|database.*error' log.txt
3. 常用选项总结
选项 | 说明 |
| 忽略大小写 |
| 显示行号 |
| 反向匹配,显示不包含模式的行 |
| 只输出匹配行的数量 |
| 只输出包含匹配项的文件名 |
| 递归搜索目录 |
| 匹配整个单词 |
| 使用扩展正则表达式 |
| 将模式视为固定字符串(不正则) |
| 显示匹配行及其后N行 |
| 显示匹配行及其前N行 |
| 显示匹配行及其前后N行 |
示例:上下文显示
# 显示匹配行及前后3行,便于查看上下文
grep -C 3 'segmentation fault' crash.log
4. 实际应用场景
- 日志分析:快速查找错误、警告信息。
- 代码搜索:在项目中查找特定函数或变量。
- 配置检查:验证配置文件中是否包含某项设置。
- 数据提取:从文本文件中提取特定格式的数据。
- 系统监控:结合
tail -f
实时监控日志中的关键词。
5. 注意事项
grep
默认区分大小写。- 模式中如果包含特殊字符(如
$
,*
,.
),建议用单引号包围,防止shell解释。 - 对于复杂搜索,建议使用
grep -E
或egrep
。 - 大文件搜索时,可结合
less
或head/tail
使用。