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 访问次数。
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 语言环境,都能加快搜索速度。
-i 忽略大小写,-n 显示行号,-r 递归搜索-E 启用扩展正则表达式-v 反向匹配,-c 统计行数