错误。grep默认支持基础正则表达式(BRE),如^、$、.、*等;通过-E启用扩展正则(ERE),-P启用Perl兼容正则(PCRE),故“不支持正则”说法错误。

grep 默认用的是基础正则(BRE),不是你写的 Perl 风格
很多人一写 grep "\d+" 就报错,因为 \d 是 PCRE(Perl)语法,grep 默认不认。它默认用的是基础正则表达式(BRE),元字符如 +、?、| 必须加反斜杠才生效,比如 \+ 表示“一个或多个前项”。
- 想用
+、?、|、( )这类符号,得加-E:用grep -E "a\+|b",而不是grep "a\+|b" -
-P能直接用\d、\w、lookbehind等,但不是所有系统都支持(比如 Alpine Linux 的 busybox grep 就没-P) - 纯文本搜索别硬套正则——用
grep -F或fgrep更快更安全,尤其当模式含.、*、[这些 shell 元字符时
匹配单词边界要用 -w,别靠 \b
\b 在 BRE 里不是单词边界(那是 PCRE 的),grep 默认根本不识别 \b。强行写 grep "\berror\b" 会字面匹配字母 b 和 e,结果错得离谱。
- 真正要匹配完整单词
error(不匹配errors或enderror),用grep -w "error" - 如果必须用正则控制边界,BRE 里可用
\ 和 <code>\>:比如grep "\<error>"</error>(注意是反斜杠 + 小于/大于号,不是\b) -
-w比手写\<...></...>更可靠,且兼容性更好;-x则用于整行精确匹配,比如grep -x "OK"只匹配单独一行就是 OK 的内容
递归搜索带正则时,-r 和 --include 必须配对用
只写 grep -r "pattern" /var/log 会扫所有文件(包括二进制、压缩包、socket 文件),轻则报错 Binary file xxx matches,重则卡住或漏结果。
- 限定文件类型:加
--include="*.log"或--include="*.conf",比如grep -r -E "timeout|fail" /etc --include="*.conf" - 排除目录:用
--exclude-dir="cache"或--exclude-dir=".git",避免无谓遍历 - 遇到 “Permission denied” 不要直接加
2>/dev/null掩盖问题——先确认是不是真需要读那些路径;必要时用sudo grep -r ...,但得清楚权限影响范围
管道传入正则时,别漏引号和转义
从 ps 或 cat 管道喂给 grep,最容易出错的是 shell 提前解析了正则里的特殊字符。
- 模式含空格、
$、*、(等,必须用单引号包裹:ps aux | grep 'nginx: worker',不能写双引号或不加引号 - BRE 中的
^、$锚定依然有效,但^start在管道中匹配的是行首,不是整个输入开头——这点常被忽略 - 想在管道里用
-E写ps aux | grep -E "(nginx|apache)",括号必须加,否则grep当普通字符处理,不会做“或”匹配
grep 用的是哪个引擎、引号包没包严、上下文是否允许锚定——这些细节不显眼,但一错就查不出东西。


















