文本搜索 #
grep 基础回顾 #
基本用法 #
bash
# 基本搜索
$ grep "pattern" file.txt
# 多文件搜索
$ grep "pattern" *.txt
# 递归搜索目录
$ grep -r "pattern" directory/
# 忽略大小写
$ grep -i "pattern" file.txt
常用选项 #
bash
# 输出控制
-n 显示行号
-c 只显示匹配行数
-l 只显示文件名
-L 显示不匹配的文件名
-o 只显示匹配部分
-q 静默模式
-s 不显示错误信息
# 匹配控制
-i 忽略大小写
-v 反向匹配
-w 匹配整个单词
-x 匹配整行
-f FILE 从文件读取模式
# 上下文控制
-A NUM 显示匹配行后 NUM 行
-B NUM 显示匹配行前 NUM 行
-C NUM 显示匹配行前后各 NUM 行
# 文件选择
-r 递归搜索
-R 递归搜索(跟随符号链接)
--include=PATTERN 只搜索匹配的文件
--exclude=PATTERN 排除匹配的文件
--exclude-dir=DIR 排除目录
正则表达式 #
基本正则表达式 (BRE) #
text
┌─────────────────────────────────────────────────────────────┐
│ 基本正则表达式 │
├─────────────────────────────────────────────────────────────┤
│ │
│ . 任意单个字符 │
│ * 前一个字符出现 0 次或多次 │
│ [abc] a、b 或 c │
│ [^abc] 不是 a、b、c │
│ [a-z] a 到 z │
│ ^ 行首 │
│ $ 行尾 │
│ \{n\} 前一个字符出现 n 次 │
│ \{n,\} 前一个字符出现至少 n 次 │
│ \{n,m\} 前一个字符出现 n-m 次 │
│ \( \) 分组 │
│ \| 或 │
│ │
│ 特殊字符转义: │
│ \. 字符 . │
│ \* 字符 * │
│ \\ 字符 \ │
│ │
└─────────────────────────────────────────────────────────────┘
扩展正则表达式 (ERE) #
bash
# 使用 -E 或 egrep
$ grep -E "pattern" file.txt
$ egrep "pattern" file.txt
# 扩展正则表达式
+ 前一个字符出现 1 次或多次
? 前一个字符出现 0 次或 1 次
{n} 前一个字符出现 n 次
{n,} 前一个字符出现至少 n 次
{n,m} 前一个字符出现 n-m 次
( ) 分组
| 或
正则表达式示例 #
bash
# 匹配邮箱
$ grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" file.txt
# 匹配 IP 地址
$ grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" file.txt
# 匹配手机号
$ grep -E "1[3-9][0-9]{9}" file.txt
# 匹配日期
$ grep -E "[0-9]{4}-[0-9]{2}-[0-9]{2}" file.txt
# 匹配 URL
$ grep -E "https?://[a-zA-Z0-9./?=_-]+" file.txt
# 匹配空行
$ grep -E "^$" file.txt
# 匹配以 # 开头的注释
$ grep -E "^#" file.txt
# 匹配 HTML 标签
$ grep -E "<[a-zA-Z]+[^>]*>" file.html
# 匹配数字
$ grep -E "[0-9]+" file.txt
$ grep -E "[[:digit:]]+" file.txt
# 匹配单词
$ grep -E "\bword\b" file.txt
grep 高级用法 #
多模式搜索 #
bash
# OR 搜索
$ grep -E "pattern1|pattern2" file.txt
$ grep -e "pattern1" -e "pattern2" file.txt
# AND 搜索
$ grep "pattern1" file.txt | grep "pattern2"
# 从文件读取模式
$ cat patterns.txt
error
warning
critical
$ grep -f patterns.txt file.txt
文件过滤 #
bash
# 只搜索特定文件
$ grep -r --include="*.py" "pattern" .
# 排除特定文件
$ grep -r --exclude="*.log" "pattern" .
# 排除目录
$ grep -r --exclude-dir={node_modules,.git} "pattern" .
# 组合使用
$ grep -r --include="*.py" --exclude-dir={venv,__pycache__} "import" .
输出格式化 #
bash
# 显示颜色
$ grep --color=auto "pattern" file.txt
# 显示匹配次数
$ grep -c "pattern" file.txt
# 显示匹配位置
$ grep -b -o "pattern" file.txt
# 只显示匹配部分
$ grep -o "pattern" file.txt
# 显示文件名和行号
$ grep -Hn "pattern" *.txt
# 显示上下文
$ grep -C 3 "pattern" file.txt
实用示例 #
bash
# 搜索代码中的函数定义
$ grep -rn "def function_name" src/
# 搜索日志中的错误
$ grep -i "error\|warning\|critical" /var/log/syslog
# 统计匹配行数
$ grep -c "ERROR" application.log
# 查找包含特定内容的文件
$ grep -rl "TODO" src/
# 搜索并高亮
$ grep --color=always -E "error|$" file.txt
# 查找大文件中的内容
$ grep "pattern" large_file.txt
# 搜索压缩文件
$ zgrep "pattern" file.gz
# 搜索二进制文件
$ grep -a "pattern" binary_file
# 显示匹配行及行号
$ grep -n "pattern" file.txt
# 统计每个文件匹配次数
$ grep -c "pattern" *.txt
grep 变体 #
egrep #
bash
# egrep 等同于 grep -E
$ egrep "pattern1|pattern2" file.txt
# 推荐使用 grep -E
$ grep -E "pattern1|pattern2" file.txt
fgrep #
bash
# fgrep 等同于 grep -F(固定字符串)
$ fgrep "literal_string" file.txt
# 不解析正则表达式,速度更快
$ grep -F "a.b" file.txt # 搜索字面量 a.b
# 推荐使用 grep -F
$ grep -F "pattern" file.txt
zgrep #
bash
# 搜索压缩文件
$ zgrep "pattern" file.gz
# 等同于
$ zcat file.gz | grep "pattern"
# 常用选项
$ zgrep -i "pattern" file.gz
$ zgrep -n "pattern" file.gz
$ zgrep -c "pattern" file.gz
ripgrep (rg) #
安装 #
bash
# Ubuntu/Debian
$ sudo apt install ripgrep
# macOS
$ brew install ripgrep
# CentOS/RHEL
$ sudo yum install ripgrep
基本用法 #
bash
# 搜索
$ rg "pattern"
# 指定目录
$ rg "pattern" src/
# 忽略大小写
$ rg -i "pattern"
# 显示行号
$ rg -n "pattern"
# 只显示文件名
$ rg -l "pattern"
# 显示匹配次数
$ rg -c "pattern"
高级用法 #
bash
# 正则表达式
$ rg "pattern1|pattern2"
# 文件类型过滤
$ rg -t py "import"
$ rg -t js "function"
$ rg -T json "key" # 排除 json 文件
# 显示上下文
$ rg -C 3 "pattern"
# 只显示匹配部分
$ rg -o "pattern"
# 替换
$ rg "old" -r "new"
# 统计信息
$ rg --stats "pattern"
rg vs grep #
text
┌─────────────────────────────────────────────────────────────┐
│ rg vs grep │
├─────────────────────────────────────────────────────────────┤
│ │
│ ripgrep (rg) │
│ ├── 速度更快 │
│ ├── 默认递归搜索 │
│ ├── 自动忽略 .gitignore 中的文件 │
│ ├── 自动检测编码 │
│ └── 支持更多文件类型 │
│ │
│ grep │
│ ├── 系统自带 │
│ ├── 兼容性好 │
│ └── 功能全面 │
│ │
└─────────────────────────────────────────────────────────────┘
实用搜索场景 #
日志分析 #
bash
# 查找错误日志
$ grep -i "error" /var/log/syslog
# 查找特定时间段的日志
$ grep "2026-04-11 10:" /var/log/syslog
# 统计错误类型
$ grep "ERROR" app.log | awk '{print $4}' | sort | uniq -c
# 查找异常堆栈
$ grep -A 10 "Exception" app.log
# 实时监控日志
$ tail -f app.log | grep --color=auto "ERROR"
代码搜索 #
bash
# 查找函数定义
$ grep -rn "def function_name" src/
# 查找类定义
$ grep -rn "class ClassName" src/
# 查找 TODO
$ grep -rn "TODO" src/
# 查找未使用的导入
$ grep -r "import" src/ | grep -v "from"
# 查找硬编码的 IP
$ grep -rn "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" src/
配置文件搜索 #
bash
# 查找配置项
$ grep -r "DEBUG" /etc/
# 查找监听端口
$ grep -r "Listen" /etc/apache2/
# 查找特定配置
$ grep -r "ServerName" /etc/
# 查找启用的配置
$ grep -v "^#" /etc/nginx/nginx.conf | grep -v "^$"
安全检查 #
bash
# 查找密码
$ grep -ri "password" /etc/
# 查找密钥
$ grep -r "BEGIN.*PRIVATE KEY" .
# 查找 SUID 文件
$ find / -perm -4000 2>/dev/null
# 查找开放端口
$ grep -r "Listen" /etc/
小结 #
通过本节学习,你应该掌握:
- grep 基础:基本搜索和常用选项
- 正则表达式:BRE 和 ERE 语法
- grep 高级:多模式、文件过滤、输出格式化
- grep 变体:egrep、fgrep、zgrep
- ripgrep:更快的搜索工具
- 实用场景:日志分析、代码搜索、安全检查
下一步,我们将学习系统管理命令。
最后更新:2026-04-11