管道和grep:命令行里的「搜索引擎」,3分钟学会海量日志里捞Bug
你打开服务器日志,屏幕上滚过10万行文字。Bug就在里面,但你肉眼翻了两小时也没找到。同事走过来,敲了一行命令,3秒就定位了问题。

那行命令只有二十几个字符,用到了一个竖线 `|` 和一个叫 `grep` 的东西。
今天我们就来拆解这套「命令行搜索引擎」——读完你就知道,为什么高手从不滚屏找Bug。
管道符 |:把两个命令串成一条流水线
管道符 `|` 的核心逻辑只有一句话:把左边命令的输出,变成右边命令的输入。
想象一个工厂流水线:第一台机器处理完原料,通过传送带送给第二台机器继续加工。管道符就是那条传送带。
看一个最简单的例子:
ls | wc -l`ls` 列出当前目录所有文件,`wc -l` 统计行数。管道把它们串起来,结果就是你当前目录下有多少个文件。一行命令,两个操作,中间没有任何临时文件。
没有管道之前,初学者会怎么做? 先把 `ls` 的结果保存到文件,再 `wc -l` 读那个文件。有了管道,数据在命令之间直接流动,省掉了中间步骤。
这就是管道的核心价值:消除中间文件,让命令像乐高一样拼接。
grep:海量文本里的「Ctrl+F」
`grep` 是 Linux 世界的搜索引擎。给它一个关键词,它在任何文本里帮你找到包含这个词的所有行。
基本用法:
grep "关键词" 文件名但 grep 真正发光发热,是在和管道配合的时候。比如,你有一个 10万行 的日志文件 `app.log`,想找出所有包含 `ERROR` 的行:
cat app.log | grep "ERROR"`cat` 把文件内容输出,管道交给 `grep`,grep 过滤出含 `ERROR` 的行。10万行瞬间筛成几十行。
更进一步——你想知道今天下午 2 点到 3 点之间出了多少次错误:
cat app.log | grep "2026-06-24 14:" | grep "ERROR" | wc -l三个管道,四个命令,串成一条流水线:
1. `cat` 吐出全部日志
2. 第一个 `grep` 筛出下午 2 点的时间段
3. 第二个 `grep` 筛出错误行
4. `wc -l` 统计行数
一行命令,等于你手动翻日志半小时的工作量。
三个实战场景,直接拿去用
### 场景一:查看某个进程还在不在
ps aux | grep nginx`ps aux` 列出所有运行中的进程,管道交给 `grep` 筛选包含 `nginx` 的。如果输出有内容,说明 Nginx 在跑;没内容,说明挂了。
### 场景二:找出占用磁盘最大的 5 个文件
du -sh * | sort -rh | head -5`du -sh *` 列出每个文件/文件夹的大小,`sort -rh` 按数字从大到小排序,`head -5` 取前 5 行。磁盘满了不知道删什么?这条命令直接告诉你。
### 场景三:统计代码仓库里谁提交最多
git log --format='%aN' | sort | uniq -c | sort -rn | head -3五个命令串成一条流水线:取作者名 → 排序 → 去重计数 → 按次数倒排 → 取前三名。一行命令跑完,团队贡献一目了然。
grep 的三个高能参数
只会 `grep “关键词”` 只能算入门。这三个参数让你的搜索能力翻倍:
### `-i`:忽略大小写
grep -i "error" app.log`Error`、`ERROR`、`error` 全都会匹配。日志里的错误大小写从来不会统一,`-i` 就是救命参数。
### `-v`:反向匹配
cat app.log | grep -v "DEBUG"输出不包含 DEBUG 的行。当你想忽略海量调试日志、只看关键信息时,`-v` 一票否决,干净利落。
### `-r`:递归搜索整个文件夹
grep -r "TODO" ./src/在 `src` 文件夹下所有文件里搜索 `TODO`。项目里有几百个文件,忘了哪个文件里写的待办?`-r` 一键扫全仓。
常见坑:别把 > 和 | 搞混
新手最容易犯的错:
ls > grep "hello" # ❌ 错误!`>` 是重定向,会把 `ls` 的结果写入一个叫 `grep` 的文件。你不会得到搜索结果,反而会损坏一个文件。
正确的做法是:
ls | grep "hello" # ✅ 正确记住:`|` 连接命令,`>` 写入文件。 一个是流水线传送带,一个是仓库入口。
今天就能用的练习
打开你的终端,依次执行这 5 条命令,感受管道和 grep 的威力:
1. `history | wc -l` —— 你到今天为止敲了多少条命令?
2. `ls -la /usr/bin | wc -l` —— 你的系统装了多少个命令?
3. `env | grep HOME` —— 你的主目录在哪里?
4. `cat /etc/passwd | grep $USER` —— 你的用户信息长什么样?
5. `history | grep “git” | wc -l` —— 你今天敲了几次 git?
每条命令不超过 30 个字符,但背后的数据量可能上千行。
命令行的精髓不在于记住所有命令,而在于知道怎么把已有的命令组合起来。 管道 `|` 就是那根串联一切的线。学会了它,你就不再是「一条命令一条命令敲」的新手,而是能搭流水线的熟练工。
下一次面对海量日志时,别滚屏。敲 `grep`。你的鼠标会感谢你的。
— END —
LC 智趣厅 · 科技与生活的交点
ihygg.cn
