一个命令的结果要给下一个命令用,这就是管道(pipe)。ls | grep xxx 是入门,但真正的高频组合是配合 sort、uniq、wc、xargs 做数据统计和批量处理:日志里统计访问量、找出重复行、数行数、把文件名批量传给命令。这篇文章把这四个命令的常用姿势讲清楚。
一、管道基础:| 和 xargs
管道 |:把前一个命令的标准输出接给后一个命令的标准输入:
cat access.log | grep "500" | wc -l # 数 500 错误有多少行
为什么需要 xargs:有些命令(如 rm、cp、echo)不读标准输入,只接受命令行参数。xargs 把管道内容转成参数传给它:
find /tmp -name "*.log" | xargs rm -f # 删除所有 .log 文件
echo "a b c" | xargs echo "前缀:" # 把输入变成参数
二、sort:排序
sort file # 按字典序排序
sort -n file # 按数字排序(-n 数字,-r 倒序)
sort -k2 -t: file # 按第 2 列排,冒号分隔
sort -u file # 排序并去重
sort -h file # 按人类可读大小排(2K, 3M, 1G)
日志统计经典组合:
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -n 10
分解:取 IP 列 → 排序(相同的排一起)→ uniq -c 统计每行出现次数 → 按次数倒序 → 取前 10,得到访问量最高的 IP 列表。
三、uniq:去重与计数
前提:uniq 只处理相邻重复行,所以前面通常先 sort:
sort file | uniq # 去重(等价 sort -u)
sort file | uniq -c # 每行出现次数
sort file | uniq -d # 只显示重复行
sort file | uniq -u # 只显示唯一行
实战:统计状态码分布
awk '{print $9}' access.log | sort | uniq -c | sort -rn
# 输出形如: 200 15230 / 404 321 / 500 12
实战:找出重复的 IP(刷量/攻击特征)
awk '{print $1}' access.log | sort | uniq -c | awk '$1 > 500 {print $1, $2}'
四、wc:计数
wc -l file # 行数(最常用)
wc -w file # 单词数
wc -c file # 字节数
cat a.txt b.txt | wc -l # 合并统计
实战:
cat access.log | wc -l # 总请求数
grep -c "500" access.log # 等价写法
ps aux | wc -l # 进程总数(含表头)
find /var/www -name "*.php" | wc -l # 统计文件数量
五、xargs:批量处理
find /backup -name "*.tar.gz" -mtime +7 | xargs rm -f # 删 7 天前备份
ls *.txt | xargs -n 1 gzip # 逐个压缩
cat urls.txt | xargs -P 5 -I{} curl -s -o /dev/null -w "%{http_code} {}\n" {} # 并发检查多个 URL
常用参数:
| 参数 | 作用 |
|---|---|
-n 1 |
每次只传 1 个参数 |
-I {} |
用 {} 占位替换,-I{} 自动按行处理 |
-P 5 |
并行 5 个进程 |
-0 |
配合 find 的 -print0 处理带空格文件名 |
文件名带空格安全处理:
find /data -name "*.log" -print0 | xargs -0 rm -f
六、组合实战
1. 日志一键统计:TOP IP、TOP 页面、状态码
awk '{print $1}' access.log | sort | uniq -c | sort -rn | head # TOP IP
awk '{print $7}' access.log | sort | uniq -c | sort -rn | head # TOP 页面
awk '{print $9}' access.log | sort | uniq -c | sort -rn # 状态码分布
2. 磁盘大文件 TOP 10
du -sh /var/www/* | sort -rh | head -n 10
3. 批量改文件后缀/批量打包
find /tmp -name "*.log" | xargs -I{} mv {} {}.bak # 批量加后缀
find /www -maxdepth 1 -type d | xargs -I{} tar czf {}.tar.gz {}
4. 统计关键词出现次数
grep -oE "error" app.log | wc -l
七、常见坑
- uniq 不去重:忘加
sort,只处理相邻行,a b a会输出两个 a; - sort 数字排错:默认字典序,"10" 排在 "9" 前,加
-n; - xargs 与带空格文件名:不加
-0会按空格拆,文件被误删/误处理; - xargs 管道空输入:输入为空时 xargs 仍会执行一次(部分版本),加
-r让空输入不执行; - 管道中错误输出:
|只传 stdout,stderr 直接打到屏幕,要合并用2>&1。
总结:管道四件套分工明确——sort 排顺序、uniq 去重计数、wc 数数量、xargs 转参数批量执行。统计日志的黄金公式是 命令 | sort | uniq -c | sort -rn | head,批量处理用 find | xargs。记住"统计靠 sort+uniq、计数靠 wc、批量靠 xargs",文本处理的大部分需求就都覆盖了。




