Linux 【08-grep命令超详细教程】
📅 2026/7/2 18:06:05
👁️ 阅读次数
📝 编程学习
Linux grep 完整详细教程
# 查询最近的 1 次异常grep-i"error\|exception\|fail"app.log|tail-1一、grep 基础介绍
grep全称Global Regular Expression Print,全局正则表达式打印,作用:在文件/标准输入中匹配文本行并输出。
语法:
grep[选项]"匹配模式"文件名# 管道用法命令|grep[选项]"匹配模式"二、常用核心选项(高频必记)
| 参数 | 作用 |
|---|---|
-i | 忽略大小写匹配 |
-n | 输出匹配行的行号 |
-v | 反向匹配,输出不匹配的行 |
-c | 只输出匹配到的行数(计数) |
-o | 只打印匹配到的字符串本身,不输出整行 |
-l | 只输出包含匹配内容的文件名 |
-L | 只输出不包含匹配内容的文件名 |
-w | 精确匹配完整单词(避免部分匹配) |
-x | 整行完全匹配 |
-A N | 匹配行 + 后N行(After) |
-B N | 匹配行 + 前N行(Before) |
-C N | 匹配行 + 前后各N行(Context) |
-r / -R | 递归遍历目录下所有文件,-R会处理软链接 |
-h | 多文件匹配时,不打印文件名 |
-q | 静默模式,无输出,只返回退出码(脚本判断用) |
-E | 使用扩展正则(等价egrep) |
-F | 纯文本匹配,不解析正则(等价fgrep) |
三、基础实操示例
1. 简单字符串匹配
# 在 test.txt 查找包含 error 的行grep"error"test.txt# 管道过滤命令输出,查看端口80进程netstat-tulpn|grep80# 查看nginx进程ps-ef|grepnginx2. 忽略大小写-i
grep-i"Error"log.txt# Error、ERROR、error 都会匹配3. 显示行号-n
grep-n"warn"app.log# 输出格式:12:xxx warn xxx4. 反向过滤-v
# 过滤掉注释行(#开头)grep-v"^#"nginx.conf# 排除空行grep-v"^$"nginx.conf5. 统计匹配行数-c
# 统计报错日志总数grep-c"ERROR"app.log6. 只输出匹配到的字符-o
# 提取所有数字grep-o"[0-9]+"test.txt7. 精确单词匹配-w
文件内容:test test123
grep"test"test.txt# 两行都匹配grep-w"test"test.txt# 只匹配独立单词 test,忽略 test1238. 显示上下文行 A/B/C
# 匹配error,同时显示前后2行grep-C2"error"app.log# 只显示匹配行后3行grep-A3"Exception"app.log# 只显示匹配行前3行grep-B3"Exception"app.log9. 递归搜索目录-r
# 在 /var/log 下所有文件搜索 "fail"grep-r"fail"/var/log# 只输出包含关键词的文件名grep-rl"root"/etc# 忽略大小写递归搜索grep-ri"mysql"/home10. 静默模式-q(shell脚本专用)
ifgrep-q"127.0.0.1"/etc/hosts;thenecho"存在本地host"fi# $? 退出码:0=匹配成功,1=无匹配,2=文件不存在四、正则表达式匹配(grep 默认基础正则)
基础正则元字符
| 符号 | 含义 |
|---|---|
. | 匹配任意单个字符 |
* | 匹配前面字符 0次或多次 |
^ | 行开头 |
$ | 行结尾 |
[] | 字符集[0-9] [a-z] [A-Z] |
[^] | 取反字符集[^0-9]非数字 |
\ | 转义符,取消元字符特殊含义 |
\{m,n\} | 匹配 m~n 次(基础正则需转义大括号) |
扩展正则-E(推荐,不用大量转义)
用-E或egrep,+ ? () {}无需转义
# 匹配手机号 1开头,11位数字grep-E"1[0-9]{10}"test.txt# 匹配 ip 简单规则grep-E"[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"# 匹配 a 或 bgrep-E"error|warn"log.txt常用正则实战案例
- 匹配以 # 开头注释行
grep"^#"nginx.conf- 匹配空行
grep"^$"nginx.conf- 匹配以 error 结尾的行
grep"error$"app.log- 匹配包含数字的行
grep"[0-9]"test.txt- 匹配纯数字整行
grep-x"[0-9]+"test.txt- 匹配邮箱简单规则
grep-E"[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z]+"- 匹配多个关键词(或)
# 方式1 -E 扩展正则 | 或grep-E"timeout|refuse|down"log# 方式2 多 grep 管道grep"timeout"log|grep"refuse"# 同时包含两个关键词(且)# 方式3 多个 -e 参数grep-e"error"-e"fail"log五、纯文本匹配-F避免正则干扰
当匹配内容包含. * \ [] ()等符号时,不想被解析成正则,用-F:
# 查找包含 www.baidu.com 的行,.不会被当作任意字符grep-F"www.baidu.com"test.txt# 等价 fgrepfgrep"www.baidu.com"test.txt六、多文件匹配规则
- 多个文件同时查找
grep"root"/etc/passwd /etc/group# 输出格式:文件名:匹配行- 多文件不显示文件名
-h
grep-h"root"/etc/passwd /etc/group- 只输出有匹配的文件名
-l
grep-l"root"/etc/*七、grep 高级实用技巧
1. 排除目录递归搜索--exclude-dir
递归搜索时跳过指定文件夹
# 搜索 /etc 下所有文件,排除 /etc/ssl 目录grep-r"listen"/etc --exclude-dir=ssl# 排除多个目录grep-r"listen"/etc --exclude-dir={ssl,systemd}2. 排除指定后缀文件--exclude
# 递归搜索,跳过 .log .tmp 文件grep-r"mysql"/home--exclude=*.{log,tmp}3. 只搜索指定后缀--include
# 只匹配 .conf 配置文件grep-r"port"/etc--include=*.conf# 匹配 .sh .py 脚本grep-r"print"./--include=*.{sh,py}4. 结合 find 批量过滤文件
# 查找所有 .log 文件并搜索 errorfind/var/log-name"*.log"-execgrep-n"ERROR"{}\;5. 过滤进程避免 grep 自身
执行ps | grep nginx会出现grep nginx这条进程,过滤掉:
ps-ef|grepnginx|grep-vgrep# 或者正则优化ps-ef|grep[n]ginx6. 彩色高亮匹配(默认自带)
大部分系统默认开启高亮,无颜色手动加--color=auto
grep--color=auto"error"app.log# 永久生效写入 ~/.bashrcecho"alias grep='grep --color=auto'">>~/.bashrcsource~/.bashrc八、grep 退出码(shell脚本判断)
执行后echo $?查看返回值:
0:找到匹配内容1:无匹配内容2:文件不存在/语法错误
示例脚本判断:
#!/bin/bashifgrep-q"8080"/etc/nginx/conf.d/default.confthenecho"端口8080已配置"elseecho"未找到8080端口"fi九、egrep / fgrep 区别总结
grep:基础正则,+ ? | () {}需要转义\egrep = grep -E:扩展正则,无需转义,日常推荐fgrep = grep -F:纯文本,完全不解析正则符号,匹配特殊字符串首选
十、高频综合命令速查表
# 1. 查看日志报错+前后3行grep-C3-i"error"app.log# 2. 递归查找代码中包含 redis 的 .java 文件grep-r"redis"./src--include=*.java-n# 3. 过滤配置文件有效内容(去掉注释、空行)grep-v"^#"nginx.conf|grep-v"^$"# 4. 统计日志报错行数grep-c"ERROR"app.log# 5. 查找所有包含root的文件并只打印文件名grep-rl"root"/etc# 6. 匹配多个关键词 error 或 timeoutgrep-E"error|timeout"app.log# 7. 提取所有IP地址grep-oE"([0-9]{1,3}\.){3}[0-9]{1,3}"access.log
在 Linux 下使用grep查询日志中的异常数据,并筛选最近 1 次或最近 n 次,核心思路是:
- 先过滤出异常行
- 再取尾部最新数据
1. 查询最近的 1 次异常
grep-i"error\|exception\|fail"app.log|tail-1或者如果日志有明确时间戳且按时间顺序追加:
tacapp.log|grep-i-m1"error\|exception\|fail"
tac是倒序读取,-m1表示匹配到第一个就停止。
2. 查询最近的 n 次异常(例如 10 次)
grep-i"error\|exception\|fail"app.log|tail-10倒序方式(最新在前):
tacapp.log|grep-i-m10"error\|exception\|fail"3. 同时显示行号(便于定位)
grep-n-i"error"app.log|tail-54. 按时间段过滤后再取最近 N 次
如果日志格式带时间,比如2026-07-01 10:...:
grep"2026-07-01"app.log|grep-i"error"|tail-35. 常用关键词匹配异常(可自定义)
grep-E"ERROR|FATAL|Exception|Timeout|Connection refused"app.log|tail-206. 查看最近 N 次异常并显示上下文(推荐排查)
grep-B2-A5-i"error"app.log|tail-30-B2:匹配行前 2 行-A5:匹配行后 5 行
7. 实时监控最新异常(动态)
tail-fapp.log|grep--line-buffered-i"error"如果你能告诉我:
- 日志格式(有无时间戳)
- 异常关键词
- 是查询文件还是
journalctl/kubectl logs
编程学习
技术分享
实战经验