简介

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"