Linux 管道与文本处理:sort、uniq、wc、xargs 组合实战


一个命令的结果要给下一个命令用,这就是管道(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

七、常见坑

  1. uniq 不去重:忘加 sort,只处理相邻行,a b a 会输出两个 a;
  2. sort 数字排错:默认字典序,"10" 排在 "9" 前,加 -n;
  3. xargs 与带空格文件名:不加 -0 会按空格拆,文件被误删/误处理;
  4. xargs 管道空输入:输入为空时 xargs 仍会执行一次(部分版本),加 -r 让空输入不执行;
  5. 管道中错误输出:| 只传 stdout,stderr 直接打到屏幕,要合并用 2>&1。

总结:管道四件套分工明确——sort 排顺序、uniq 去重计数、wc 数数量、xargs 转参数批量执行。统计日志的黄金公式是 命令 | sort | uniq -c | sort -rn | head,批量处理用 find | xargs。记住"统计靠 sort+uniq、计数靠 wc、批量靠 xargs",文本处理的大部分需求就都覆盖了。


手机扫码阅读

微信或手机浏览器扫一扫,随时随地随心阅读与分享

systemctl 服务管理详解:systemd 开机自启、查看状态与 journalctl 日志实战

LNMP 环境搭建教程:Nginx + MySQL + PHP 从零部署网站

评 论
更换验证码