grep 文本搜索

grep 是最常用的文本搜索工具,名字来源于 "Global Regular Expression Print"。它能快速在文件中查找匹配的行,支持正则表达式,是日志分析和代码搜索的必备利器。

基本用法

在文件中搜索包含指定字符串的行:

grep "error" logfile.txt
grep "root" /etc/passwd

搜索多个文件:

grep "function" *.js
grep "TODO" src/*.py

常用选项

选项含义
-i忽略大小写
-v反向匹配,显示不匹配的行
-n显示行号
-c只显示匹配的行数
-l只显示包含匹配的文件名
-r递归搜索目录
-w匹配整个单词
-A n显示匹配行及后 n 行
-B n显示匹配行及前 n 行
-C n显示匹配行及前后各 n 行
grep -i "ERROR" app.log
grep -n "function" script.sh
grep -c "404" access.log
grep -r "TODO" ./src

正则表达式

grep 支持正则表达式,让搜索更灵活:

grep "^root" /etc/passwd
grep "bash$" /etc/passwd
grep "[0-9]\{3\}" data.txt

常用正则元字符:

元字符含义
^行首
$行尾
.任意单个字符
*前一个字符出现 0 次或多次
[]字符集合
[^]排除字符集合
\{n,m\}出现 n 到 m 次

扩展正则

-E 选项启用扩展正则表达式(等同于 egrep):

grep -E "error|warning" app.log
grep -E "[0-9]+" data.txt
grep -E "a{2,4}" test.txt

扩展正则不需要转义大括号和括号,更直观。

实用示例

查找进程

ps aux | grep nginx
ps aux | grep -v grep | grep nginx

grep -v grep 排除 grep 自身的进程。

分析日志

grep "ERROR" app.log | wc -l
grep -E "ERROR|WARN" app.log
grep "2024-03-15" app.log | grep "error"

查找代码

grep -rn "function_name" ./src
grep -r "import" --include="*.py" .
grep -r "TODO" --exclude="*.min.js" .

显示上下文

grep -C 3 "error" app.log
grep -A 5 "Exception" app.log

统计匹配次数

grep -c "200" access.log
grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+" access.log | sort | uniq -c

-o 只输出匹配的部分,配合 sort 和 uniq 可以统计 IP 访问次数。

grep 的变体

egrep:等同于 grep -E,使用扩展正则表达式。

fgrep:等同于 grep -F,将模式视为固定字符串,不解析正则。搜索大量文本时更快。

zgrep:在压缩文件中搜索,不用先解压。

zgrep "error" app.log.gz

性能优化

搜索大文件时,一些技巧可以提升速度:

grep -F "固定字符串" bigfile.txt
LC_ALL=C grep "pattern" bigfile.txt

-F 不解析正则,LC_ALL=C 使用 C 语言环境,都能加快搜索速度。

小结

  • grep 是文本搜索的首选工具
  • -i 忽略大小写,-n 显示行号,-r 递归搜索
  • -E 启用扩展正则表达式
  • -v 反向匹配,-c 统计行数
  • 配合管道和其他命令,功能更强大