摘要:
grep是日志分析的第一把刀,但很多人只会grep 关键词,结果一屏刷几千行、想统计又数不出来。这篇把grep讲透:-c统计、-n定位、-v排除、-i忽略大小写、-E扩展正则、-A/-B/-C看上下文、-f从文件读模式;再给三条实战管道(404 统计、IP 过滤、/posts/访问量),以及「结果太多怎么逐步缩小范围」的四步法。核心只有一句话:grep是筛子,不是计算器。承接上篇:日志分析的三层次「看 → 筛 → 析」和
grep/awk/sed的分工讲清了。
一、老周的「针」和「海」
早上到工位,老周丢给小林一个任务:
「你练的那份access.log,现在多少行?」
sudowc-l/var/log/nginx/access.log输出:
102347 /var/log/nginx/access.log「10 万行。」小林说。
「现在,你从这 10 万行里,找出所有状态码 500 的请求,统计有多少条,列出前 5 个 URL。」
小林打开grep手册,准备逐条查参数。
老周拦住他:「别查手册。手册是字典,不是教材。你直接上手,遇到问题再查。」
「那我怎么写?」
「你想想,你要什么。」
「我要 500 的请求。」
「那你就grep " 500 "。」
sudogrep" 500 "/var/log/nginx/access.log终端刷了一屏,还在继续。
「停。」老周说,「你Ctrl+C。」
小林按了Ctrl+C。
「你犯了两个错。」老周说,「第一,你没统计数量,直接刷屏。第二,你没想清楚grep到底怎么用。今天,我就把grep给你讲透。」
二、grep的基本逻辑:按行匹配
「grep的逻辑非常简单。你给它一个模式,它逐行扫描,把匹配的行打印出来。」
grep"模式"文件「它会输出所有包含500的行。注意,前后有空格。」
「为什么加空格?」
「因为500可能出现在 IP 里、响应大小里、时间戳里。加空格,是为了把匹配限定在状态码那一段。」老周说,「但这不是最严谨的——最严谨的是awk '$9 == 500'。」
「那grep还有啥用?」
「grep适合快速过滤文本。比如你找某个 IP、某个 URL、某个关键词。」老周说,「grep是『筛子』,不是『计算器』。你用它筛出你关心的行,再用awk去算。」
小林记下:
grep "模式" 文件:按行匹配;- 加空格是为了精确匹配字段;
grep负责筛,awk负责算。
三、grep常用参数:一个一个试
-c:只统计数量
「你刚才刷屏,就是因为没加-c。」
sudogrep-c" 500 "/var/log/nginx/access.log输出:
500「500 条 500 请求。」小林说。
「-c只输出匹配行数,不输出内容。你以后统计数量,第一反应就是-c。」
-n:显示行号
「你想知道 500 请求在第几行。」
sudogrep-n" 500 "/var/log/nginx/access.log|head-5输出:
1234:192.168.1.100 - - [14/Sep/2026:10:00:03 +0800] "GET /api/health HTTP/1.1" 500 153 "-" "curl/7.81.0" 5678:192.168.1.101 - - [14/Sep/2026:10:05:12 +0800] "POST /api/login HTTP/1.1" 500 200 "-" "curl/7.81.0" ...「行号在冒号前面。」老周说,「你以后定位问题,用-n找到行号,再用sed -n '行号p'看上下文。」
-v:反向匹配
「你想排除某些行。」
sudo