grep支持基本正则(BRE)和扩展正则(ERE,需-E),配合-w、^、$等实现全词、行首、行尾匹配;常用元字符包括.、[]、*、+、?及分组();实战中可高效提取邮箱、IPv4、日期、引号字符串等;-r、-n、-C、-o、-v等选项提升筛选与输出控制能力。

直接用 grep 加正则表达式就能匹配复杂文本,关键在于选对模式写法和配套选项。默认用的是基本正则(BRE),想写得更简洁推荐加 -E 切换到扩展正则(ERE)。
基础匹配:从简单字符串过渡到结构化模式
普通字符串搜索只是起点。比如找“error”,grep "error" file.log 就够;但若要区分是独立单词还是嵌在其他词里(如“errors”或“enderror”),就得用 -w 全词匹配:grep -w "error" file.log。再进一步,如果只关心以 error 开头的行,就加上锚点:grep "^error" file.log;结尾匹配则用 "error$"。
常用正则元素怎么写才有效
写正则时别硬背,按实际需求组合元字符:
-
.匹配任意单个字符,a.c可匹配 “abc”、“a2c”、“a c” -
[0-9]或[[:digit:]]匹配数字;[a-z]匹配小写字母;[^[:space:]]+表示“一个或多个非空白字符” -
*表示前一字符出现 0 次或多次;+(需-E)表示 1 次或多次;?表示 0 或 1 次 - 用括号
()和\1(BRE)或$1(grep -E配sed)可做分组引用,比如grep -E "(ab)+c" file匹配 “abc”、“ababc” 等
实战常见复杂场景
真正用得多的是这些典型模式:
- 邮箱:
grep -E "[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}" file.txt - IPv4 地址:
grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" file.txt(注意它不校验每段 ≤255,仅格式层面) - 时间戳(如 YYYY-MM-DD):
grep -E "[0-9]{4}-[0-9]{2}-[0-9]{2}" file.log - 带引号的字符串:
grep -E '"[^"]*"' file.conf—— 匹配成对双引号内任意内容
配合选项让结果更可控
光有正则不够,输出方式决定效率:
-
-r递归查目录,grep -r -E "failed|timeout" /var/log/ -
-n显示行号,-C 2展开上下文,查报错时特别有用 -
-o只输出匹配到的片段(不是整行),配合wc -l可统计出现总次数:grep -o "error" file.log | wc -l -
-v反向筛选,比如排除注释和空行:grep -v "^#" file.conf | grep -v "^$"


















