Linux grep 命令:文本搜索与日志分析实战指南

举报
yd_232564628 发表于 2026/10/08 10:28:03 2026/10/08
【摘要】 grep (Global Regular Expression Print) 是 Linux 三剑客(grep、awk、sed)之一,诞生于 1974 年,名字源于 ed 编辑器的 g/re/p 命令。它几乎出现在每一个 Linux 脚本和运维命令中,是文本处理流水线里不可或缺的一环。无论是排查日志、审计配置,还是在代码库中定位函数调用,grep 都能以极低的成本完成任务。 最基础的用法gr...

grep (Global Regular Expression Print) 是 Linux 三剑客(grep、awk、sed)之一,诞生于 1974 年,名字源于 ed 编辑器的 g/re/p 命令。它几乎出现在每一个 Linux 脚本和运维命令中,是文本处理流水线里不可或缺的一环。无论是排查日志、审计配置,还是在代码库中定位函数调用,grep 都能以极低的成本完成任务。

最基础的用法

grep "pattern" file.txt

在 file.txt 中搜索包含 pattern 的行,匹配的行会被输出到终端。如果省略文件名,grep 会从标准输入读取,因此可以配合管道使用:

cat file.txt | grep "pattern"

实际使用中,高频场景与命令组合

1. 忽略大小写

grep -i "error" /var/log/syslog

-i (ignore-case) 同时匹配 Error、ERROR、error 等变体,日志排查时几乎必用。

2. 显示行号

grep -n "TODO" ./src/main.py

-n (line-number) 在每行前面标注行号,方便快速定位到源文件中的具体位置。

3. 递归搜索目录

grep -rn "database_url" ./config/

-r (recursive) 递归搜索目录下所有文件,-n 同时显示行号。这是代码搜索的常用组合。

4. 只输出匹配的文件名

grep -rl "import os" ./src/

-l (files-with-matches) 只列出包含匹配内容的文件名,不显示具体行。适合"哪些文件用到了某个模块"这类问题。

5. 反向匹配(排除)

grep -v "^#" /etc/nginx/nginx.conf

-v (invert-match) 输出不匹配的行。配合 ^# 可以过滤掉配置文件中的注释行,只看有效配置。

6. 提取上下文

grep -C 3 "Exception" app.log     # 匹配行前后各 3 行
grep -B 5 "panic" app.log         # 匹配行前面 5 行
grep -A 10 "error" app.log        # 匹配行后面 10 行

-C (context)、-B (before)、-A (after) 在排查日志时非常有用——错误本身往往只有一行,但根因藏在上下文里。

7. 精确单词匹配

grep -w "user" /etc/passwd

-w (word-regexp) 只匹配完整的单词,避免 user 匹配到 username、superuser 等。

8. 统计匹配行数

grep -c "404" /var/log/nginx/access.log

-c (count) 输出匹配的行数,快速统计某个错误出现的次数。

9. 使用正则表达式

# 基本正则
grep "^[0-9]\{3\}\.[0-9]\{3\}" file.txt

# 扩展正则(推荐)
grep -E "^[0-9]{3}\.[0-9]{3}" file.txt

# Perl 兼容正则(功能最强)
grep -P "\d{3}\.\d{3}" file.txt

-E 启用扩展正则,语法更简洁;-P 启用 Perl 兼容正则,支持 \d、\s、前瞻后顾等高级特性。

10. 多关键词搜索

grep -E "error|warning|critical" /var/log/syslog

用 | 分隔多个关键词,匹配任意一个即输出。等价于:

grep -e "error" -e "warning" -e "critical" /var/log/syslog

11. 配合管道过滤命令输出

ps aux | grep nginx
df -h | grep "/dev/sda"
journalctl -u nginx | grep "failed"

这是 grep 最经典的用法——从大量输出中筛选出关心的行。

12. 高亮匹配内容

grep --color=auto "error" /var/log/syslog

大多数发行版默认已开启颜色高亮。如果没生效,可以手动指定 --color=auto。

如果不知道如何下手,可以先尝试

grep -rn "error" /var/log/ --include="*.log" | head -20

这条命令递归搜索 /var/log/ 下所有 .log 文件中的 error,显示行号,并限制输出前 20 行。这是快速了解"日志里有什么错误"的快捷方式。

或者,当你在代码中查找某个函数的所有调用位置时:

grep -rn "def process_data" ./src/      # 找定义
grep -rn "process_data(" ./src/         # 找调用

性能优化技巧

  • 大文件搜索用 grep -F:如果搜索的是固定字符串而非正则,-F (fixed-strings) 会关闭正则引擎,速度显著提升。
  • 限制搜索文件类型:grep -rn --include="*.py" "pattern" ./ 避免扫描无关文件。
  • 排除目录:grep -rn --exclude-dir=node_modules "pattern" ./ 跳过大型依赖目录。
  • 并行搜索大目录:rg (ripgrep) 是 grep 的现代替代品,默认并行搜索且智能忽略 .gitignore 文件,在代码库中搜索时体验更好。

grep 与相关工具对比

工具 特点 适用场景
grep 通用、预装、兼容性好 日常脚本、日志过滤
egrep 等价于 grep -E 需要扩展正则时
fgrep 等价于 grep -F 纯文本搜索,追求速度
rg (ripgrep) 并行搜索、智能忽略 代码库搜索
ag (the silver searcher) 类似 rg,更早出现 代码库搜索
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。