专用比较模式
sort 除了字典序与字段排序,还提供几类专用比较模式:-h 按人类可读大小(1K、2M、3G)排序、-V 按版本号分段排序、-R 随机打乱、-u 去重、-s 稳定排序。这些模式能省掉很多原本要写脚本的场景:du 输出按大小排行用 -rh,包版本列表用 -V,抽检用 -R。另一个容易被忽视的点是默认按当前 locale 排序,结果依赖环境且更慢,处理 ID 与 URL 这类机器数据建议固定 LC_ALL=C。
基本信息
| 适用平台 | Linux/macOS(GNU coreutils;BSD sort 支持其中大部分选项) |
|---|---|
| 命令语法 | sort [选项] 文件 |
| 常用选项 | -n 数字 -h 人类可读 -V 版本号 -R 随机 -r 逆序 -u 去重 -k 键 -t 分隔符 -s 稳定 -o 输出文件 |
| 环境影响 | LC_ALL=C 会改变排序规则并提升速度,机器数据处理推荐固定它 |
| 大文件处理 | 用 -S 调整内存缓冲,必要时用 --parallel 并行排序 |
典型使用场景
- 目录大小排行:du 输出配合 -rh 得到直观榜单
- 磁盘用量排行:df 输出按使用率排序
- 版本排序:把 1.10 正确排在 1.9 之后
- 随机抽检:用 -R 打乱后取前几条做人工核验
- 去重统计:先 -u 去重再计数
常用示例
常用示例
du -sh * | sort -rh | head # 按大小排行
df -h | sort -k5 -rh # 按使用率排序
rpm -qa | sort -V | tail # 版本号排序
sort -R list.txt | head # 随机取几条
sort -u domains.txt | head # 去重
LC_ALL=C sort urls.txt | uniq -c | sort -rn | head
sort -t: -k3,3n -S 1G /etc/passwd # 加大排序缓冲专用比较模式
| 选项 | 比较规则 | 典型场景 |
|---|---|---|
| -h | 识别 K、M、G 等后缀并按数量级比较 | du 与 df 输出排行 |
| -V | 按版本号分段比较 | 软件版本列表排序 |
| -n | 纯数值比较 | 计数与数值列 |
| -R | 随机排序(不是密码学安全随机) | 抽检与洗牌 |
| -u | 输出去重后的唯一值 | 生成唯一值列表 |
-n 只认纯数字。带 K、M 后缀的大小要用 -h,混用会出现 100K 排在 9 前面这类明显错误的结果。
大文件排序会使用临时目录,占用空间可能与输入规模相当。处理超大文件前先确认临时目录容量,并用 -S 与 --parallel 调整资源使用。
默认情况下 sort 在比较出相等键后还会做整行比较作为兜底,因此结果确定但不保留输入顺序。加 -s 可以关闭兜底比较,让相等键维持原有相对顺序。
--parallel 控制并行排序的线程数,-S 控制内存缓冲大小。两者配合可以减少临时文件读写,但当机器本身 IO 或 CPU 紧张时要谨慎调大。