管道和grep:命令行里的「搜索引擎」,3分钟学会海量日志里捞Bug

你打开服务器日志,屏幕上滚过10万行文字。Bug就在里面,但你肉眼翻了两小时也没找到。同事走过来,敲了一行命令,3秒就定位了问题。

管道和grep:命令行里的「搜索引擎」,3分钟学会海量日志里捞Bug封面

那行命令只有二十几个字符,用到了一个竖线 `|` 和一个叫 `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

滚动至顶部
微信公众号:LC智趣厅

扫码关注微信公众号
LC智趣厅