sort 是什么
sort 按行对文本排序,是文本处理管道里的常客。默认按当前 locale 的字典序比较整行,-n 改数值序、-h 认 1K/2M/3G 这类后缀、-V 做版本号序,-k 指定排序键、-t 指定字段分隔符,-u 边排序边去重。它内部把结果写到临时文件再归并,所以能处理远超内存的数据量,代价是 /tmp 需要有足够空间。
基本信息
| 适用平台 | Linux 发行版通用(GNU coreutils) |
|---|---|
| 命令语法 | sort [选项] [文件...] |
| 常用选项 | -n 数值 / -h 人类可读数字 / -V 版本号 / -r 逆序 / -u 去重 / -k 键 / -t 分隔符 / -f 忽略大小写 / -s 稳定排序 / -S 内存上限 / --parallel 并行度 |
| 默认行为 | 整行比较、受 locale 影响、相等行的先后顺序不保证 |
典型使用场景
- 统计 TOP N:sort | uniq -c | sort -rn | head 是万用公式
- 按某列排序报表:sort -t, -k3,3n data.csv 按第三列数值排
- 大文件外部排序:sort -S 2G --parallel 4 big.txt 限制内存并并行
- 版本号排序:ls /opt | sort -V 让 v1.9 排在 v1.10 前面
- 去重:sort -u 或先 sort 再 uniq(uniq 只合并相邻重复行)
常用示例
常用示例
sort data.txt # 字典序(受 locale 影响)
sort -n numbers.txt # 数值序,否则 10 会排在 2 前面
sort -r -n numbers.txt # 数值逆序
sort -u emails.txt # 排序并去重
sort -t: -k3,3n /etc/passwd # 按第 3 字段数值排序(冒号分隔)
sort -h sizes.txt # 识别 1K / 2M / 3G
sort -V versions.txt # 版本号序:v1.9 在 v1.10 之前
LC_ALL=C sort big.log # 字节序,更快且跨机器一致常用选项
| 选项 | 作用 | 使用提示 |
|---|---|---|
| -n | 按数值比较 | 纯数字列必用 |
| -h | 识别 K/M/G/T 后缀的数值 | 大小、流量类字段 |
| -V | 按版本号顺序比较 | 排序 v1.9 与 v1.10 |
| -k 起点[,终点] | 指定排序键,可加 n/r/f 修饰 | 多列排序的核心 |
| -t 字符 | 指定字段分隔符 | 与 -k 搭配,默认空白 |
| -u | 排序时去除整行重复 | 等价于先 sort 再 uniq |
| -s | 稳定排序,相等行保持原相对顺序 | 需要可复现结果时 |
| -S N | 限制主内存用量 | 大文件外部排序调优 |
大数据量排序建议加 LC_ALL=C:字节序比较比 locale 规则快,且跨机器结果一致,脚本行为可预期。代价是中文与重音字符不再按语言学顺序排。
-k2 会从第 2 字段一直比到行尾,只按第 2 字段排序要写 -k2,2。这是「排序结果不听话」最常见的原因。
键修饰符
| 修饰符 | 含义 |
|---|---|
| n | 按数值比较 |
| r | 逆序 |
| f | 忽略大小写 |
| b | 忽略前导空白 |
| h | 识别人类可读的数字后缀 |
| V | 按版本号比较 |
| M | 按月份英文缩写排序 |
多列排序写法
- -k1,1 -k3,3n 表示先按第 1 列字典序,再按第 3 列数值升序
- -k2,2r 对第 2 列降序,其余列维持默认比较
- -t, -k5,5nr 是逗号分隔文件里常见的组合:先定分隔符再定键
- 键号从 1 开始计数,和 awk 的 $1、$2 一一对应
- 键之间用逗号隔开时要注意 -k1,1n 还是 -k1n,前者只比第 1 段,后者会延伸到行尾
多列示例
多列示例
sort -t, -k1,1 -k3,3n report.csv # 主键第 1 列,次键第 3 列数值
sort -t: -k3,3nr /etc/passwd # 第 3 列数值降序
sort -k2,2f names.txt # 忽略大小写按第 2 列
sort -u -t, -k1,1 data.csv # 按第 1 列去重,保留每组第一行-u 去重按的是参与比较的部分:配合 -k1,1 时是「同一第一列只保留一条」,而不是整行去重,这一点经常被误当成 bug。
外部排序的归并临时文件写在 TMPDIR 指向的目录,默认是 /tmp。输入几百 GB 时用 TMPDIR=/data/tmp sort ... 把临时空间换到容量充足的盘,避免中途报磁盘不足。
sort 可以直接接收多个文件参数并按归并方式处理,效果等价于先 cat 再排序,但不需要真的落一份中间文件,处理按天切分的分片日志时写成 sort part-* 即可。
做对账、比对这类需要反复复现的工作,把 LC_ALL 与 -s 一并固定,并把完整选项写进脚本注释,避免换了机器或换了 shell 后结果对不上。