别只会基础grep!这篇全实战教程,日志排查/文本检索/筛选过滤,1行命令精准定位- 服务器日志动辄几万行,手动翻找ERROR、WARN关键词,效率极低还容易漏
- 想筛选不含某内容的行、模糊匹配字符串,完全不知道grep参数怎么写
- 多目录、多文件批量检索,只会逐个文件查,耗时又费力
- grep大小写敏感、特殊符号检索报错,折腾半天找不到原因
- 面试被问grep高阶用法,只会基础检索,答不上来丢分
- 掌握基础检索、高阶过滤、正则匹配、批量查询全场景用法
- 避开80%新手高频坑,特殊符号、大小写、跨平台问题一键解决
Linux零基础小白、运维工程师、后端/测试开发、运维面试备考者、服务器运维人员
先搞懂grep的底层逻辑和基础规则,理解原理再记命令,事半功倍,全程大白话无晦涩术语。grep全称Global Regular Expression Print(全局正则表达式打印),是Linux系统自带的文本检索工具——逐行扫描文本,匹配指定关键词/正则规则,打印符合条件的行。核心优势:检索速度快、支持正则匹配、适配单文件/多文件/管道符、服务器无依赖,是运维排查问题的第一利器。grep处理文本的流程固定,理解这3步,再也不会用错:读取目标文本(单文件/多文件/管道输入) → 匹配设定规则(关键词/正则) → 打印匹配行(可附加行号、上下文等信息)grep [选项参数] "匹配关键词/正则" 目标文件/目录
- 关键词建议用双引号/单引号包裹,含空格、特殊符号时必须加引号
- 支持单文件检索、多文件检索、递归检索目录下所有文件
- 可搭配管道符`|`,处理其他命令的输出结果(高频用法)
- 默认大小写敏感、只匹配关键词、不显示行号、不递归检索目录
新建`grep_test.txt`测试文件,后续所有命令均基于此文件演示,直接复制执行即可:cat > grep_test.txt << EOFHello Linuxhello grepLinux is powerfulGREP isafilter tooltest 123Test 456error: connection failedERROR: timeout# 注释行:配置参数port=8080port=9090EOF
二、核心高频命令:按场景分类,学完直接用(干货主体)本章按使用频率从高到低拆分,每个命令带格式+实战案例+代码注释+执行效果,贴合运维、开发日常场景,可直接复制套用。最简单的关键词匹配,适合快速定位单行内容,是日常最常用的用法。# 格式:grep"关键词" 文件名grep"Linux" grep_test.txt
执行效果:打印文件中含`Linux`的所有行,默认大小写敏感# 同时检索当前目录下的.txt文件grep"port"*.txt# 检索指定多个文件grep "error" grep_test.txt /var/log/syslog
# -i:ignore case,忽略大小写grep -i "grep" grep_test.txt
执行效果:同时匹配`grep`、`GREP`、`Grep`等所有大小写组合# -n:linenumber,显示行号grep -n "error" grep_test.txt
针对反向筛选、精准过滤、上下文查看等场景,解决日志冗余、无效信息干扰问题。# -v:invertmatch,排除匹配行grep -v "test" grep_test.txt# 排除注释行和空行(运维常用)grep -v "^#" grep_test.txt | grep -v "^$"
# -w:word regexp,全词匹配,避免匹配到包含关键词的字符串grep -w "is" grep_test.txt
执行效果:只匹配独立单词`is`,不会匹配`his`、`this`等含is的字符串3. 查看匹配行上下文(-A/-B/-C,排错必备)# -A n:after,显示匹配行+后n行grep -A 2"error" grep_test.txt# -B n:before,显示匹配行+前n行grep -B 2"port" grep_test.txt# -C n:context,显示匹配行+前后n行grep -C 1"ERROR" grep_test.txt
# -c:count,只打印匹配行数,不打印具体内容grep -c"port" grep_test.txt
适合多目录批量检索、静默查询、只显示文件名等场景,适配大规模文件检索。# -r:递归检索当前目录及子目录下所有文件grep -r "8080" /etc/# 忽略大小写递归检索grep -ri"error" /var/log/
# -l:files-with-matches,只显示含关键词的文件名,不显示匹配行grep -rl "port" ./
# -q:quiet,不输出任何内容,通过返回值判断是否匹配($?=0代表匹配成功)grep -q "error" grep_test.txt && echo"发现错误日志" || echo"无错误"
# -e:匹配多个关键词,满足任一即可grep -e "error" -e "port" -e "Linux" grep_test.txt
grep默认支持基础正则,加`-E`参数启用扩展正则,无需繁琐转义,适配模糊匹配、格式筛选场景。# 匹配以port开头的行grep "^port" grep_test.txt# 匹配以数字结尾的行grep "[0-9]$" grep_test.txt# 匹配test+任意字符的行grep "test." grep_test.txt
# -E:启用扩展正则,支持|(或)、+(一次及多次)、?(0次或一次)# 匹配error或ERRORgrep -E "error|ERROR" grep_test.txt# 匹配123或456grep -E "123|456" grep_test.txt
grep搭配管道符,可过滤其他命令的输出结果,这是运维日常最常用的用法,远超直接检索文件。# 1. 查看进程,过滤nginx进程ps -ef | grep nginx | grep -v grep# 2. 查看端口占用,过滤8080端口netstat -tulnp | grep8080# 3. 查看系统日志,过滤内核错误dmesg | grep -i error# 4. 实时监控日志,过滤ERROR行tail -f /var/log/messages | grep -i error
还原真实运维、开发场景,所有命令可直接复制到服务器执行,解决日常痛点。# 1. 提取Nginx错误日志中的500报错grep -n "500" /var/log/nginx/error.log# 2. 实时监控应用日志,过滤WARN和ERRORtail -f app.log | grep -iE "warn|error"# 3. 统计当日错误日志条数grep -c"$(date +%Y-%m-%d)" /var/log/app.log
# 1. 过滤MySQL配置文件中的端口和绑定地址grep -E "port|bind-address" /etc/my.cnf# 2. 排除注释行和空行,查看有效配置grep -v "^#" /etc/ssh/sshd_config | grep -v "^$"# 3. 递归查找所有配置文件中的3306端口grep -rl "3306" /etc/
# 1. 精准查找Java进程,排除grep自身ps -ef | grep java | grep -v grep# 2. 查找占用80端口的进程ss -tulnp | grep :80# 3. 查找僵尸进程ps -ef | grep defunct | grep -v grep
# 脚本片段:判断服务是否启动,未启动则重启#!/bin/bashif ! ps -ef | grep -q nginx | grep -v grep; thenecho"Nginx未启动,正在重启..." systemctl start nginxelseecho"Nginx已运行"fi
💡坑1:特殊符号检索报错原因:grep默认把`^$.*[]|()`等当作正则符号,直接检索会语法报错解决:加`-F`参数(固定字符串,不解析正则),或用反斜杠`\`转义特殊符号示例:`grep -F "port=8080" grep_test.txt`💡坑2:管道符检索时,grep自身也被匹配原因:`ps | grep xxx`会把grep进程也筛选出来解决:追加`grep -v grep`排除自身示例:`ps -ef | grep nginx | grep -v grep`💡坑3:大小写敏感导致漏查原因:grep默认区分大小写,日志中关键词大小写不统一时查不到解决:必加`-i`参数忽略大小写💡坑4:递归检索目录无权限报错原因:检索系统目录时,普通用户无权限访问部分文件解决:追加`2>/dev/null`屏蔽错误输出示例:`grep -r "error" /var/log 2>/dev/null`- -r vs -R:-r递归目录,-R递归且跟随软链接,日常用-r足够
- grep vs egrep vs fgrep:egrep=grep -E(扩展正则),fgrep=grep -F(固定字符串)
- -w vs 无-w:-w全词匹配,避免误匹配子字符串
Mac系统grep用法和Linux基本一致,仅递归检索、特殊符号处理无差异,部分Mac版本可安装gnu-grep,完全适配Linux命令。
| |
| |
| |
| |
| |
| |
| |
| ps | grep 进程名 | grep -v grep |
- grep中-i、-v、-n、-r参数分别有什么作用?
- 用grep检索特殊符号(如$、#)时,为什么会报错?怎么解决?
grep的核心就是“匹配规则+输出控制”,日常工作记住-i、-n、-v、-r、-E这5个高频参数,搭配管道符,足以应对90%的检索、排查场景。新手牢记:查日志加-i和-n,排进程加-v grep,查目录加-r。