文章目录
前言
grep
(Global Regular Expression Print)是 Linux 中最常用的文本搜索工具之一,用于在文件或输入流中查找匹配指定模式(如字符串或正则表达式)的行。它支持强大的正则表达式,是日志分析、代码调试和日常文本处理的必备工具。
一、基本语法
grep [选项] "搜索模式" 文件或目录
二、核心功能与常用选项
选项 | 功能说明 |
---|---|
-i | 忽略大小写(Case-Insensitive) |
-v | 反向匹配(显示不包含模式的行) |
-n | 显示匹配行的行号 |
-r 或 -R | 递归搜索目录下的所有文件 |
-w | 精确匹配单词(避免部分匹配) |
-c | 统计匹配行的数量(不显示具体内容) |
-l | 仅显示包含匹配项的文件名 |
-A NUM | 显示匹配行及其后 NUM 行(After Context) |
-B NUM | 显示匹配行及其前 NUM 行(Before Context) |
-C NUM | 显示匹配行及其前后各 NUM 行 |
--color=auto | 高亮显示匹配内容 |
三、示例详解
1. 基础搜索
# 在文件中搜索包含 "error" 的行
grep "error" log.txt
# 忽略大小写搜索 "warning"
grep -i "warning" log.txt
# 显示匹配行的行号
grep -n "error" log.txt
2. 递归搜索目录
# 递归搜索当前目录及子目录下所有文件中的 "TODO"
grep -r "TODO" .
# 仅显示包含匹配项的文件名
grep -rl "config" /etc/
3. 反向匹配
# 显示不包含 "success" 的行(排除成功日志)
grep -v "success" log.txt
4. 统计匹配次数
# 统计文件中 "404" 状态码出现的次数
grep -c "404" access.log
5. 精确匹配单词
# 匹配独立的单词 "port"(避免匹配 "port80" 或 "support")
grep -w "port" config.txt
6. 使用正则表达式
# 匹配以 "start" 开头的行
grep "^start" file.txt
# 匹配以 "end" 结尾的行
grep "end$" file.txt
# 匹配空行(^表示行首,$表示行尾)
grep "^$" file.txt
# 匹配包含数字的行([0-9] 或 [[:digit:]])
grep "[0-9]" data.txt
# 匹配 "error" 或 "warning"
grep -E "error|warning" log.txt # -E 启用扩展正则
7. 结合管道符过滤其他命令输出
# 查看进程列表中所有 "nginx" 进程
ps aux | grep "nginx"
# 检查系统是否安装了 "python3"
dpkg -l | grep "python3"
四、注意事项
-
正则表达式转义
- 特殊字符(如
$
,*
,+
,?
,()
等)需用\
转义(或使用-E
启用扩展正则)。 - 示例:匹配
$100
需写为"\$100"
。
- 特殊字符(如
-
引号的使用
- 搜索模式包含空格或特殊符号时,用双引号包裹(如
"hello world"
)。
- 搜索模式包含空格或特殊符号时,用双引号包裹(如
-
性能优化
- 避免对大文件直接使用复杂正则表达式,可先用
grep
过滤范围。 - 递归搜索时指定文件类型(如
grep -r --include="*.log" "error"
)。
- 避免对大文件直接使用复杂正则表达式,可先用
-
符号链接处理
- 默认
-r
不跟随符号链接,若需跟随使用-R
。
- 默认
-
颜色高亮
- 将
alias grep='grep --color=auto'
加入~/.bashrc
永久启用高亮。
- 将
五、综合示例
# 在日志中查找 "500" 错误,显示前后 3 行并高亮
grep -C 3 --color=auto "500" access.log
# 递归搜索所有 ".conf" 文件中包含 "timeout" 的行(显示文件名和行号)
grep -rn --include="*.conf" "timeout" /etc/
# 统计所有 ".py" 文件中 "import" 出现的次数
grep -rc "import" *.py
总结
掌握 grep
能极大提升文本处理效率,建议结合 man grep
查阅完整文档!