文本搜索 #

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/

小结 #

通过本节学习,你应该掌握:

  1. grep 基础:基本搜索和常用选项
  2. 正则表达式:BRE 和 ERE 语法
  3. grep 高级:多模式、文件过滤、输出格式化
  4. grep 变体:egrep、fgrep、zgrep
  5. ripgrep:更快的搜索工具
  6. 实用场景:日志分析、代码搜索、安全检查

下一步,我们将学习系统管理命令。

最后更新:2026-04-11