Linux grep 完整详细教程# 查询最近的 1 次异常grep-ierror\|exception\|failapp.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 的行greperrortest.txt# 管道过滤命令输出查看端口80进程netstat-tulpn|grep80# 查看nginx进程ps-ef|grepnginx2. 忽略大小写-igrep-iErrorlog.txt# Error、ERROR、error 都会匹配3. 显示行号-ngrep-nwarnapp.log# 输出格式12:xxx warn xxx4. 反向过滤-v# 过滤掉注释行#开头grep-v^#nginx.conf# 排除空行grep-v^$nginx.conf5. 统计匹配行数-c# 统计报错日志总数grep-cERRORapp.log6. 只输出匹配到的字符-o# 提取所有数字grep-o[0-9]test.txt7. 精确单词匹配-w文件内容test test123greptesttest.txt# 两行都匹配grep-wtesttest.txt# 只匹配独立单词 test忽略 test1238. 显示上下文行 A/B/C# 匹配error同时显示前后2行grep-C2errorapp.log# 只显示匹配行后3行grep-A3Exceptionapp.log# 只显示匹配行前3行grep-B3Exceptionapp.log9. 递归搜索目录-r# 在 /var/log 下所有文件搜索 failgrep-rfail/var/log# 只输出包含关键词的文件名grep-rlroot/etc# 忽略大小写递归搜索grep-rimysql/home10. 静默模式-qshell脚本专用ifgrep-q127.0.0.1/etc/hosts;thenecho存在本地hostfi# $? 退出码0匹配成功1无匹配2文件不存在四、正则表达式匹配grep 默认基础正则基础正则元字符符号含义.匹配任意单个字符*匹配前面字符 0次或多次^行开头$行结尾[]字符集[0-9] [a-z] [A-Z][^]取反字符集[^0-9]非数字\转义符取消元字符特殊含义\{m,n\}匹配 m~n 次基础正则需转义大括号扩展正则-E推荐不用大量转义用-E或egrep ? () {}无需转义# 匹配手机号 1开头11位数字grep-E1[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-Eerror|warnlog.txt常用正则实战案例匹配以 # 开头注释行grep^#nginx.conf匹配空行grep^$nginx.conf匹配以 error 结尾的行greperror$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-Etimeout|refuse|downlog# 方式2 多 grep 管道greptimeoutlog|greprefuse# 同时包含两个关键词且# 方式3 多个 -e 参数grep-eerror-efaillog五、纯文本匹配-F避免正则干扰当匹配内容包含. * \ [] ()等符号时不想被解析成正则用-F# 查找包含 www.baidu.com 的行.不会被当作任意字符grep-Fwww.baidu.comtest.txt# 等价 fgrepfgrepwww.baidu.comtest.txt六、多文件匹配规则多个文件同时查找greproot/etc/passwd /etc/group# 输出格式文件名:匹配行多文件不显示文件名-hgrep-hroot/etc/passwd /etc/group只输出有匹配的文件名-lgrep-lroot/etc/*七、grep 高级实用技巧1. 排除目录递归搜索--exclude-dir递归搜索时跳过指定文件夹# 搜索 /etc 下所有文件排除 /etc/ssl 目录grep-rlisten/etc --exclude-dirssl# 排除多个目录grep-rlisten/etc --exclude-dir{ssl,systemd}2. 排除指定后缀文件--exclude# 递归搜索跳过 .log .tmp 文件grep-rmysql/home--exclude*.{log,tmp}3. 只搜索指定后缀--include# 只匹配 .conf 配置文件grep-rport/etc--include*.conf# 匹配 .sh .py 脚本grep-rprint./--include*.{sh,py}4. 结合 find 批量过滤文件# 查找所有 .log 文件并搜索 errorfind/var/log-name*.log-execgrep-nERROR{}\;5. 过滤进程避免 grep 自身执行ps | grep nginx会出现grep nginx这条进程过滤掉ps-ef|grepnginx|grep-vgrep# 或者正则优化ps-ef|grep[n]ginx6. 彩色高亮匹配默认自带大部分系统默认开启高亮无颜色手动加--colorautogrep--colorautoerrorapp.log# 永久生效写入 ~/.bashrcechoalias grepgrep --colorauto~/.bashrcsource~/.bashrc八、grep 退出码shell脚本判断执行后echo $?查看返回值0找到匹配内容1无匹配内容2文件不存在/语法错误示例脚本判断#!/bin/bashifgrep-q8080/etc/nginx/conf.d/default.confthenecho端口8080已配置elseecho未找到8080端口fi九、egrep / fgrep 区别总结grep基础正则 ? | () {}需要转义\egrep grep -E扩展正则无需转义日常推荐fgrep grep -F纯文本完全不解析正则符号匹配特殊字符串首选十、高频综合命令速查表# 1. 查看日志报错前后3行grep-C3-ierrorapp.log# 2. 递归查找代码中包含 redis 的 .java 文件grep-rredis./src--include*.java-n# 3. 过滤配置文件有效内容去掉注释、空行grep-v^#nginx.conf|grep-v^$# 4. 统计日志报错行数grep-cERRORapp.log# 5. 查找所有包含root的文件并只打印文件名grep-rlroot/etc# 6. 匹配多个关键词 error 或 timeoutgrep-Eerror|timeoutapp.log# 7. 提取所有IP地址grep-oE([0-9]{1,3}\.){3}[0-9]{1,3}access.log在 Linux 下使用grep查询日志中的异常数据并筛选最近 1 次或最近 n 次核心思路是先过滤出异常行再取尾部最新数据1. 查询最近的 1 次异常grep-ierror\|exception\|failapp.log|tail-1或者如果日志有明确时间戳且按时间顺序追加tacapp.log|grep-i-m1error\|exception\|failtac是倒序读取-m1表示匹配到第一个就停止。2. 查询最近的 n 次异常例如 10 次grep-ierror\|exception\|failapp.log|tail-10倒序方式最新在前tacapp.log|grep-i-m10error\|exception\|fail3. 同时显示行号便于定位grep-n-ierrorapp.log|tail-54. 按时间段过滤后再取最近 N 次如果日志格式带时间比如2026-07-01 10:...grep2026-07-01app.log|grep-ierror|tail-35. 常用关键词匹配异常可自定义grep-EERROR|FATAL|Exception|Timeout|Connection refusedapp.log|tail-206. 查看最近 N 次异常并显示上下文推荐排查grep-B2-A5-ierrorapp.log|tail-30-B2匹配行前 2 行-A5匹配行后 5 行7. 实时监控最新异常动态tail-fapp.log|grep--line-buffered-ierror如果你能告诉我日志格式有无时间戳异常关键词是查询文件还是journalctl/kubectl logs