
Linux 重定向与管道
以前我手抄命令结果写报告,学会了这些符号以后一个回车就搞定
Linux基础 实战课
Linux 基础实战课 · 进阶篇
————————————————
💬 毕业设计那会儿,导师让我把服务器上各应用的 CPU、内存、磁盘占用汇总成一份报告。我的做法是:ps aux 跑一遍,手动抄 CPU 和内存的数字到 Excel;df -h 再跑一遍,手动抄磁盘数据……
后来师兄看我操作,丢过来一行命令:
ps aux --sort=-%mem | head -6 > report.txt && echo '---' >> report.txt && df -h >> report.txt | 一条命令生成一份报告 |
三秒出结果。从那之后我才真正理解什么是「命令行之美」——不是一条命令多强,是把简单命令像积木一样拼起来的力量。
今天把重定向和管道的玩法一次讲透,这是我整个基础课系列里最想写的一篇。
————————————————
一、五个符号,记住就不用查了
符号 | 作用 | 例句 |
> | 覆盖输出到文件(文件会被清空重写) | echo hello > file.txt |
>> | 追加到文件末尾 | echo line2 >> file.txt |
2> | 把错误输出重定向到文件 | cmd 2> error.log |
| | 管道:把左边命令的输出喂给右边命令 | ps aux | grep nginx |
tee | 输出到屏幕 + 同时存到文件 | ps aux | tee ps.txt |
二、> vs >>:覆盖还是追加
这两个是最容易搞混的:
echo '第一行' > log.txt | 写入(覆盖原文件) |
echo '第二行' >> log.txt | 追加到末尾 |
cat log.txt 会看到:
⚠️ 用 > 之前想清楚:文件里原来的内容会被清空!好多人的配置文件就是这么丢的。不确定的时候就先用 >>,追加总比覆盖安全。
三、管道 |:命令组合的灵魂
管道符号 | 把前一个命令的输出变成后一个命令的输入。这是 Linux 命令行的核心思想——小工具组合出大效果。
几个经典用法:
ps aux | grep nginx | 在所有进程中过滤 nginx |
cat /var/log/syslog | grep ERROR | 从日志中过滤 ERROR 行 |
du -sh /* | sort -rh | head -5 | 找出磁盘占用最大的 5 个目录 |
管道可以串联多个:
cat access.log | grep '500' | awk '{print $1}' | sort | uniq -c | sort -rn | head -10 | 找访问日志中哪些 IP 触发了最多的 500 错误(Top 10) |
💡 管道串联的精髓:每一步只做一件事,但组合起来能做任何事。像搭乐高一样——grep 负责过滤,awk 负责提取字段,sort 负责排序,uniq 负责去重。
四、tee:边看边存
管道的问题是数据流进去了就看不到了。tee 解决了这个问题——它把水龙头劈成两条路,一条继续流向下一级管道,一条存到文件:
ps aux | tee processes.txt | grep nginx | 保存完整进程列表,同时只看 nginx |
df -h | tee disk_report.txt | 看磁盘的同时保存报告 |
五、2>&1:错误也一起收了
有时候你写了个脚本 > log,结果却发现错误信息没有入日志,全喷在屏幕上了。
原因:Linux 有两条输出流——标准输出(stdout,文件描述符 1)和标准错误(stderr,文件描述符 2)。> 默认只重定向 stdout。
要把错误也一起收进来:
./backup.sh > log.txt 2>&1 | stdout 和 stderr 都进 log.txt |
拆开看:./backup.sh > log.txt 把正常输出写到 log.txt,2>&1 把错误输出(2)重定向到标准输出(1)——也就是同一个 log.txt。
💡 2>&1 必须写在 > file 后面,不能反过来。先 > file 开了重定向的路,再 2>&1 跟着走。反过来写的话 2>&1 不知道要指向哪里。
六、实战组合技:运维日常高频用法
① 查看到底哪些进程在吃内存:
ps aux --sort=-%mem | head -6 | 内存 Top 5 |
② 看 80 端口是谁在用:
ss -tlnp | grep :80 | 监听 80 的进程 |
③ 系统信息一键快照保存:
(echo '===DISK===' && df -h && echo '===MEM===' && free -h && echo '===CPU===' && uptime) | tee system_report.txt | 保存系统状态快照 |
④ 日志实时监控 + 存档:
tail -f /var/log/nginx/access.log | tee -a /tmp/nginx_monitor.txt | 边看日志边存档 |
⑤ 找最大的 10 个文件:
find / -type f -size +100M 2>/dev/null | xargs ls -lhS | head -10 | 找出大于 100MB 的文件,忽略没权限的报错 |
看到了吗:2>/dev/null 把「权限不够」的报错丢到黑洞(/dev/null),输出清清爽爽只显示重要的。
掌握重定向和管道之后,你的命令行效率能提高一个数量级。从「运行命令 → 看结果 → 手动处理 → 运行下一个命令」变成「一条管道五个命令 → 出结果」。
这也是我基础课系列想传递的最核心的东西——Linux 不是靠记住几百个命令,是靠学会把简单的东西组合出复杂的威力。
————————————————
至此,Linux 基础实战课全部完结。从最基本的命令速查到重定向管道,这个系列涵盖了日常运维中最核心的技能。
如果你一路跟下来了,现在应该能独立登录服务器、管理用户、操作文件、分析日志、写脚本、配定时任务、管防火墙。恭喜你,已经比 90% 的「会用电脑」的人强了。
下一阶段,我准备开一个「运维实战翻车记录」番外系列,聚焦真实故障排查——Nginx 502 是怎么找出来的、磁盘满了怎么紧急处理、数据库连接池被打爆了怎么办……全是真金白银的实战经验。
————————————————
下期预告:《docker系列》
后续都是两天更新一篇文章了,感谢大家支持
💬 基础课系列完结了,你最喜欢哪一篇?
还想看哪个专题?番外篇你最想了解什么故障场景?评论区告诉我
👍 点赞💬 留言🔄 转发给需要的朋友
有问题欢迎评论区留言,看到都会回复