grep 是 Linux 命令行中使用频率最高的工具之一,它的全称是 Globally search for a Regular Expression and Print matching lines,即在文件或输入流中搜索匹配正则表达式的行并打印出来。无论是分析日志、筛选配置文件还是从大量输出中提取关键信息,grep 都以速度快、功能专一著称。
基本用法
grep 最简单的形式就是在一个或多个文件中搜索某个字符串:
grep "error" /var/log/syslog # 在 syslog 中查找包含 "error" 的行
grep "root" /etc/passwd # 查看系统中 root 用户的信息
如果只是想检查文件中是否存在某个模式,而不关心具体行内容,可以用 -q 静默模式,适合在脚本中做条件判断:
if grep -q "backup complete" /var/log/backup.log; then
echo "备份成功"
fi
常用选项
-i:忽略大小写(Case-insensitive)。grep -i "warning" log.txt会同时匹配Warning、WARNING等。-v:反向匹配,输出不包含指定模式的行。grep -v "^#" config.conf可以排除注释行。-n:显示匹配行的行号,方便定位。grep -n "timeout" app.log会输出类似42:connection timeout的结果。-c:统计匹配的行数,而不是列出具体内容。grep -c "200" access.log可以快速查看成功请求的数量。-r或-R:递归搜索目录下所有文件。grep -r "TODO" ~/project/会找出项目中所有标记了待办事项的位置。-l:只输出包含匹配内容的文件名,而不是具体行。适合找出哪些文件含有某关键字。-w:匹配整个单词,避免部分匹配。grep -w "root" /etc/passwd不会把 "rooter" 这种单词的变体也匹配进来。-x:匹配整行,行内容必须与模式完全一致。
这些选项可以自由组合,比如 grep -rin "error" /var/log/ 会递归、忽略大小写地搜索并显示行号,是日常排查中最常用的组合之一。
正则表达式支持
grep 的威力很大程度上来自对正则表达式的支持。默认情况下,grep 使用基本正则表达式(BRE),通过 -E 选项(或直接使用 egrep)可以启用扩展正则表达式(ERE),后者更加现代化且易读。
常用正则元字符(ERE 模式下):
.:匹配任意单个字符(除换行符外)。*:匹配前一个字符零次或多次。+:匹配前一个字符一次或多次。?:匹配前一个字符零次或一次。^:锚定行首。^ERROR表示行必须以 ERROR 开头。$:锚定行尾。done$表示行必须以 done 结尾。[abc]:匹配方括号中的任意一个字符。[^abc]:匹配不在方括号中的任意字符。(pattern):分组,用于后续的重复或引用。|:或运算,匹配左右任意一个表达式。
实用示例:
# 查找 IP 地址形式的行(粗略匹配)
grep -E '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' access.log
# 找出所有以 # 开头或空白的行(配置文件中的注释和空行)
grep -E '^#|^$' nginx.conf
# 匹配时间格式 HH:MM:SS
grep -E '[0-9]{2}:[0-9]{2}:[0-9]{2}' log.txt
# 只显示以 "ERROR" 或 "FATAL" 开头的行,并带行号
grep -En '^(ERROR|FATAL)' app.log
如果想使用 Perl 风格的正则表达式(更丰富的元字符,如 \d、\s、\w 等),可以使用 grep -P(大多数 Linux 发行版的 GNU grep 支持)。
上下文控制
查看匹配行的前后几行内容往往比只看孤立的一行更有帮助:
-B num:显示匹配行之前的 num 行(Before)。-A num:显示匹配行之后的 num 行(After)。-C num:显示匹配行前后各 num 行(Context)。
例如,grep -C 3 "panic" /var/log/kern.log 会显示内核恐慌前后各三行,便于快速定位问题发生时的系统状态。
与其他命令组合
grep 最常与管道一起作为过滤器:
ps aux | grep "nginx" # 查看 nginx 相关进程
dmesg | grep -i "error" # 内核日志中查找硬件或驱动错误
cat /proc/cpuinfo | grep "model name" | uniq # 获取 CPU 型号信息
实用技巧与注意事项
- 颜色高亮:多数发行版已默认启用
--color=auto,匹配的字符串会标红,阅读更直观。如果没有,可手动添加alias grep='grep --color=auto'到.bashrc。 - 搜索二进制文件:直接
grep二进制文件可能会干扰终端显示。使用-a选项可以将二进制文件当作文本处理,或者先用strings提取可读字符串再传给grep。 - 大小写敏感场景:如果确定数据中的字母大小写有意义(如密码字段),避免使用
-i,以免造成误匹配。 - 性能考量:
grep对单次文本搜索进行了高度优化,对于 GB 级别的文件也能快速完成。但如果是超大规模日志且需要反复查询,可以考虑配合正则反向索引工具(如ag、ripgrep)进一步提速。 - 递归搜索排除目录:
grep -r --exclude-dir={node_modules,.git}可以在递归时跳过指定目录,避免搜索到大量无关文件。
grep 的强项在于专注:它只做文本匹配这一件事,并且将其做到了极致。熟练使用 grep 和正则表达式,会让你在日志分析、系统配置、代码浏览等任务中如虎添翼,也是进一步学习 awk、sed 等更复杂文本处理工具的重要基础。