Linux grep 命令完全指南:从入门到精通

Linux grep 命令完全指南:从入门到精通

Someone Lv5

引言

grep 是 Linux 系统中最强大的文本搜索工具之一。它的名字来源于 Global Regular Expression Print(全局正则表达式打印),可以在文件中搜索匹配指定模式的行并输出。无论是日常开发、服务器运维还是日志分析,grep 都是不可或缺的利器。

本文将系统性地介绍 grep 的核心参数、正则表达式用法、实战案例以及高级技巧。

一、基本语法

1
grep [选项] "模式" 文件名

最简单的用法是在单个文件中搜索关键词:

1
grep "error" /var/log/nginx/access.log

二、核心参数详解

下面是 grep 最常用的参数速查表:

参数长格式说明
-i--ignore-case忽略大小写
-v--invert-match反向匹配,输出不包含模式的行
-n--line-number显示匹配行的行号
-r--recursive递归搜索子目录
-l--files-with-matches只输出包含匹配的文件名
-c--count输出每个文件的匹配行数
-w--word-regexp按单词精确匹配
-E--extended-regexp使用扩展正则表达式
-o--only-matching只输出匹配的部分,而非整行
-A n--after-context输出匹配行及后 n 行
-B n--before-context输出匹配行及前 n 行
-C n--context输出匹配行及前后各 n 行

常用参数示例

忽略大小写搜索:

1
2
grep -i "warning" app.log
# 匹配 Warning、WARNING、warning 等

显示行号并递归搜索:

1
2
grep -rn "TODO" /home/project/src/
# 输出类似:src/main.js:42: // TODO: 优化性能

反向匹配(排除干扰行):

1
2
grep -v "^#" /etc/nginx/nginx.conf
# 过滤掉注释行,只显示有效配置

输出上下文:

1
2
grep -C 3 "FATAL ERROR" server.log
# 显示匹配行及其前后各 3 行,便于定位错误上下文

三、正则表达式实战

3.1 基本正则表达式(BRE)

默认情况下 grep 使用基本正则表达式,部分元字符需要转义:

1
2
3
4
5
6
7
8
9
10
11
# 匹配以 error 开头的行
grep "^error" log.txt

# 匹配以句号结尾的行
grep "\.$" log.txt

# 匹配包含数字的行
grep "[0-9]" data.txt

# 匹配空行
grep "^$" file.txt

3.2 扩展正则表达式(ERE)

使用 -E 参数启用扩展正则表达式,无需转义 +?|() 等元字符:

1
2
3
4
5
6
7
8
# 匹配 error 或 warning(二选一)
grep -E "error|warning" log.txt

# 匹配连续 3 个以上的数字
grep -E "[0-9]{3,}" log.txt

# 匹配 IP 地址(简化版)
grep -E "([0-9]{1,3}\.){3}[0-9]{1,3}" access.log

3.3 Perl 兼容正则表达式(PCRE)

使用 -P 参数启用 Perl 兼容正则,支持更高级的特性:

1
2
3
4
5
6
7
8
9
# 非贪婪匹配
grep -oP 'href="(.*?)"' index.html

# 正向前瞻(提取域名)
echo "user@example.com" | grep -oP '\w+(?=@)'
# 输出:user

# 负向后顾
grep -P '(?<!http)s://' urls.txt

四、实战案例

案例 1:分析 Nginx 访问日志

1
2
3
4
5
6
7
8
# 统计 404 错误数量
grep -c ' 404 ' /var/log/nginx/access.log

# 找出所有 5xx 错误并显示 IP
grep -E 'HTTP/1\.[01]" 5[0-9]{2}' access.log | awk '{print $1}' | sort | uniq -c | sort -rn

# 统计每小时请求量
grep "07/Jun/2026" access.log | grep -oP ':[0-9]{2}:[0-9]{2}:[0-9]{2}' | cut -d: -f1 | sort | uniq -c

案例 2:代码仓库批量搜索

1
2
3
4
5
6
7
8
# 搜索所有 Python 文件中的函数定义
grep -rn "^def " --include="*.py" /home/project/

# 找出所有 FIXME 注释并统计
grep -rn "FIXME" --include="*.{js,py,java}" . | wc -l

# 搜索排除 node_modules 目录
grep -rn "apiKey" --exclude-dir=node_modules .

案例 3:系统诊断

1
2
3
4
5
6
7
8
# 查看非 root 用户的 crontab
grep -v "^#" /etc/crontab | grep -v "^$"

# 检查磁盘使用率超过 80% 的分区
df -h | grep -E "[8-9][0-9]%|100%"

# 查看当前运行的 Python 进程
ps aux | grep -E "[p]ython"

五、高效组合技巧

5.1 grep + find

1
2
# 在最近 7 天修改过的文件中搜索关键词
find /var/log -name "*.log" -mtime -7 -exec grep -l "ERROR" {} \;

5.2 grep + xargs

1
2
3
4
5
# 批量删除包含敏感信息的文件
grep -rl "password" /home/user/ | xargs rm -f

# 批量修改文件权限
grep -rl "#!/bin/bash" /scripts/ | xargs chmod +x

5.3 多模式匹配

使用 -f 从文件中读取多个模式:

1
2
3
4
5
6
7
8
9
# 创建模式文件
cat > patterns.txt << EOF
^ERROR
^CRITICAL
^FATAL
EOF

# 用模式文件搜索
grep -f patterns.txt system.log

六、性能优化

处理大文件时,以下技巧可以显著提升速度:

技巧 命令 说明
使用 LC_ALL=C LC_ALL=C grep pattern bigfile 禁用 locale 处理,提速 2-3 倍
固定字符串模式 grep -F "literal" file 不使用正则,纯文本匹配
提前终止 grep -m 10 pattern file 找到 10 个匹配后停止
并行处理 parallel grep pattern {} ::: *.log 多 CPU 同时搜索
内存映射 grep --mmap pattern file 使用内存映射(旧内核有效)

大文件搜索示例

1
2
3
4
5
# 在 10GB 日志中快速定位错误
time LC_ALL=C grep -F "OutOfMemoryError" huge.log

# 只取前 5 个匹配并显示行号
grep -n -m 5 "ERROR" huge.log

七、常见陷阱与注意事项

  1. 不要用 grep -r 搜索二进制文件 — 加 -I 参数忽略二进制文件,或使用 --binary-files=without-match
  2. 模式中有空格时务必加引号grep "hello world" file 而不是 grep hello world file
  3. -v-c 组合时注意含义grep -vc pattern file 输出不匹配的行数
  4. 彩色输出默认可能被管道禁用 — 用 grep --color=always 强制保留颜色

八、快速参考:常用场景速查

需求场景命令
递归搜索所有 .log 文件grep -rn --include="*.log" "pattern"
统计重复次数grep -o "pattern" file \| sort \| uniq -c \| sort -rn
搜索并替换grep -rl "old" . \| xargs sed -i 's/old/new/g'
只显示文件名grep -rl "pattern" .
区分大小写grep -i "pattern" file
精确匹配单词grep -w "exact" file
多文件统计grep -c "pattern" *.log
跨行匹配grep -Pz 'line1\\n.*line2' file

结语

grep 虽然只有四个字母,但其背后的正则表达式体系和丰富的参数选项让它成为 Linux 文本处理的瑞士军刀。掌握 grep 不仅能提高日常工作效率,更是深入使用 Linux 命令行的基本功。建议读者在终端中多动手练习,将本文中的示例逐一运行加深理解。


本文由AI辅助生成,内容仅供参考

  • 标题: Linux grep 命令完全指南:从入门到精通
  • 作者: Someone
  • 创建于 : 2026-06-07 10:30:00
  • 更新于 : 2026-06-18 08:39:57
  • 链接: https://demo-blog.qusite.cn/2026-06-07-grep-guide/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。