会了 ls、cd、pwd 只是刚进门。终端真正的爽点在于:把一堆小命令用管道串成流水线,前一个的输出直接喂给下一个,一行顶你点几十下鼠标。这一篇讲最常用的几类命令和”管道思维”。
把命令想成工厂里的工人,每人只干一件事(看文件、搜内容、数行数)。管道 | 就是传送带,把上一个工人的产出传给下一个。你搭好流水线,原料进去、成品出来。
看文件内容
cat app.log # 一次性打印全部内容(短文件用)
less app.log # 分页看,空格翻页、q 退出(大文件用)
head -n 20 app.log # 看前 20 行
tail -n 20 app.log # 看最后 20 行
tail -f app.log # 实时追踪新增内容(看日志必备,Ctrl+C 退出)
tail -f 是盯日志的神器:服务跑起来后,错误实时滚出来,不用反复打开文件。
搜内容:grep
grep "error" app.log # 找出含 error 的行
grep -i "error" app.log # 忽略大小写
grep -rn "TODO" src/ # 递归搜 src 目录里所有文件
grep -n "func" app.js # 显示行号
grep -rn 是”在代码里全局找某个词”的标配,比编辑器搜索有时更快,尤其远程服务器上。
找文件:find
find . -name "*.js" # 当前目录及子目录找所有 .js 文件
find . -type f -size +10M # 找大于 10MB 的文件
find . -name "config.*" # 找名字含 config 的文件
管道:把命令连起来
这是核心。用 | 把前一个命令的输出,作为后一个命令的输入:
# 在日志里找 error,再只取前 10 行
grep "error" app.log | head -n 10
# 统计日志里 error 出现了多少次
grep -c "error" app.log
# 看某个接口被请求了多少次(统计含 /api 的行数)
grep "/api" access.log | wc -l
# 找出出现频率最高的前 5 个 IP
grep -oE "\b([0-9]{1,3}\.){3}[0-9]{1,3}\b" access.log | sort | uniq -c | sort -rn | head -5
最后这条是经典流水线:grep 抽取 IP → sort 排序 → uniq -c 去重计数 → sort -rn 按次数倒序 → head 取前 5。单独每个命令都简单,串起来就解决了”谁访问最多”这种实际问题。
重定向:把结果存起来
ls -la > filelist.txt # 把输出写进文件(覆盖)
ls -la >> filelist.txt # 追加到文件末尾
command 2> error.log # 把错误输出单独存
> 是覆盖、>> 是追加,常用来把命令结果存成报告。
通配符
rm *.log # 删所有 .log
ls src/*.js # 列出 src 下所有 js
cp report.* backup/ # 复制所有 report 开头文件
* 匹配任意多个字符,? 匹配单个字符,[abc] 匹配其中任一个。
常见新手坑
cat大文件:几万行刷屏,应该用less或head/tail。grep忘加-r就搜目录:只搜单个文件,搜不到子目录里的内容。>误用覆盖重要文件:本想>>追加,写成>把原内容清空了。重要文件先备份。- 管道顺序搞反:
A | B是 A 的输出给 B,想清楚”谁的输出喂给谁”。
小测验
- 问题1:实时看日志新增内容用什么?答案:
tail -f 文件名。 - 问题2:
grep "error" log | wc -l在干嘛?答案:统计日志里含 error 的行数。 - 问题3:
>和>>区别?答案:>覆盖写入,>>追加到末尾。
更多实战:用流水线排查一个慢接口
假设用户说”订单接口偶尔很慢”,你手上有访问日志 access.log,每行带响应时间。找出最慢的 5 个请求:
grep "POST /order" access.log | sort -t' ' -k3 -rn | head -5
拆解:grep 筛出订单请求 → sort 按第 3 列(假设是耗时)倒序 → head 取前 5。这条流水线把”翻几万行日志”压缩成一秒钟的结果。
重定向的坑
ls > list.txt # 覆盖写,原内容没了
ls >> list.txt # 追加,原内容保留
command > out.txt 2>&1 # 标准输出和错误都写进同一文件
重要提醒:> 是覆盖,误用会清空重要文件。操作前确认目标文件不重要,或先用 >>。删文件前也先 pwd 确认位置。
自测:你真的懂了吗
- 实时看日志新增用什么?答案:
tail -f 文件名。 grep "error" log | wc -l在干嘛?答案:统计日志里含 error 的行数。>和>>区别?答案:>覆盖、>>追加。
常见认知误区
命令组合这块,新手常踩几个坑。第一,用 cat 看大文件——几万行刷屏根本看不过来,大文件应该用 less 或 head/tail。第二,grep 忘加 -r 就搜目录——只搜单个文件,搜不到子目录里的内容,全局搜要加 -r。第三,> 误用覆盖重要文件——本想 >> 追加写成 > 把原内容清空了,重要文件操作前先备份。第四,管道顺序搞反——A | B 是 A 的输出喂给 B,想清楚”谁的输出给谁”。第五,以为命令只能单个用——其实管道把小命令串成流水线,才是终端真正的威力所在,每个命令只干一件事,组合解决复杂问题。第六,通配符用错——rm *.log 会删所有日志,执行删除类命令前先 ls 确认匹配到的是哪些文件,再动手。
这一篇你该记住的
- 看内容:
cat/less/head/tail -f(盯日志)。 - 搜内容:
grep -rn全局搜;找文件:find -name。 - 管道
|串联命令,前一个输出喂后一个,搭流水线解决复杂问题。 - 重定向:
>覆盖、>>追加。 - 通配符
*匹配任意,?匹配单个。
下一篇我们讲 终端快捷键:不用死记命令,几个组合键就能让你在黑框框里健步如飞。