有次线上排查,同事一个一个文件翻日志,翻了半小时没找到。一根竖线,看着不起眼。但会用的人,一条命令能干别人写几十行脚本的事。今天把管道符的8个实战案例拆给你,每一条都是真刀真枪换来的经验。
管道符 | 到底是什么
管道符 | 就干一件事:把前一个命令的输出,直接变成后一个命令的输入。就像工厂流水线。上一道工序的成品,不用落地,直接传给下一道工序。中间不停顿,不用人工搬运。最简单的例子:ls | grep log。ls列出所有文件,grep只筛出带log的。一条管道搞定,不用先ls保存到文件,再grep去文件里搜。但很多人对管道符的理解就停留在"连接两个命令"。实际上,管道可以把十几个命令串成一条流水线。每一步只做一件事,最后一步出结果。这就是管道符的威力:单条命令能力有限,但组合起来威力翻倍。
为什么管道符值十年功力
不会管道符的人:手动一个个文件翻,或者写几十行Python脚本,调半天还报错。单条命令只能做一件事。ls只能列文件,grep只能搜索,sort只能排序。但用管道串起来,ls列文件→grep筛选→sort排序→head取前10,30秒出结果,不需要写脚本,不需要调试。单条命令是工具,管道是武器。会用工具的人能干活,会用武器的人能打胜仗。
案例1:统计访问量Top10的IP
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10
拆解:5个命令串成一条管道,每一步只做一件事。awk提取第一列IP→sort排序让相同IP挨在一起→uniq -c统计每个IP出现次数→sort -rn按次数倒序→head -10取前10。有次服务器被爬虫疯狂请求,这条命令一跑,攻击IP直接暴露,iptables一封,世界清净了。
案例2:找出占用磁盘最大的10个目录
du -ah / | sort -rh | head -10
拆解:du -ah计算所有文件和目录的大小→sort -rh按人类可读的数字倒序→head -10取前10。踩坑:别上来就du -sh /*,范围太大等于大海捞针。先从根目录开始,用这条命令定位最大的目录,再一层层往下钻。du -ah会列出所有文件,比du -sh更细,配合sort直接排序,省了你自己找。
案例3:批量杀掉某个用户的所有进程
ps -u username | awk '{print $1}' | xargs kill -9
拆解:ps -u username列出该用户的所有进程→awk提取第一列PID→xargs把PID传给kill -9。踩坑:xargs是管道里的关键角色。很多人用管道只会在两个命令之间传文本,但有些命令不接受管道输入,只接受命令行参数。xargs就是桥梁,把管道传过来的文本变成命令行参数。没有xargs,这一条管道就断了。
案例4:统计代码项目行数
find . -name ”*.java” | xargs wc -l
拆解:find找到所有.java文件→xargs传给wc -l统计行数。踩坑:find + xargs是管道组合里最经典的搭档之一。find负责找文件,xargs负责把文件名传给后续命令。换个后缀就能统计Python、JS、Go,灵活得很。加个-sort还能按行数排序,找出最大的文件。
案例5:实时监控日志中的错误信息
tail -f /var/log/app.log | grep --color=auto ”ERROR”
拆解:tail -f实时追踪日志→grep过滤只看ERROR行→--color=auto高亮显示。踩坑:这条我用了3年。以前线上排查,要么开日志文件手动翻,要么tail -f刷屏看不过来。加了grep管道之后,只看ERROR行,信息量瞬间降下来,关键错误一个不漏。配合--color=auto高亮,眼睛扫一眼就能定位。
案例6:批量替换多个文件中的字符串
find . -name ”*.conf” | xargs sed -i 's/old_ip/new_ip/g'
拆解:find找到所有.conf文件→xargs传给sed→sed -i原地替换。踩坑:sed -i是原地修改,直接改文件内容,不留备份。生产环境建议先跑一遍不带-i的,确认替换结果没问题再加-i。有次同事直接sed -i,结果正则写错了,把整个配置文件改乱了,服务直接崩了。先试后改,这是铁律。
案例7:查看端口被谁占了
lsof -i:8080 | grep LISTEN
拆解:lsof -i:8080查看8080端口的所有信息→grep LISTEN只看监听状态。踩坑:lsof -i:8080会列出所有跟8080端口相关的连接,包括已建立的连接和监听状态。加grep LISTEN只看谁在监听,精准定位。有次一个僵尸进程占着8080,ps aux里根本找不到,lsof | grep LISTEN直接揪出来,kill掉就好了。
案例8:压缩备份时排除某些目录
场景:备份整个项目,但排除node_modules和logsfind /path -not -path ”*/node_modules/*” -not -path ”*/logs/*” | tar -czf backup.tar.gz -T -
拆解:find排除指定目录→tar -T -从标准输入读取文件列表。踩坑:tar自己的--exclude参数也能排除目录,但当排除规则复杂的时候,find的过滤能力更强。--not -path可以写多层排除,支持通配符。tar -T -表示从标准输入读取文件列表,这个参数很多人不知道,但配合管道特别好用。有次一个项目node_modules占了3个G,用这条管道排除后,备份文件从4G缩到200M。
单条命令是工具,管道是武器。ls、grep、awk、sort,单个用只能做一件事。但串起来,就是一条流水线,30秒出结果。建议你收藏这篇,下次出事的时候翻出来照着敲。不用背,用的时候能找到就行。管道符的精髓,不是记住多少命令,是知道怎么把命令串起来。这一串,就值十年功力。