文本处理77 条

sort 排序文本行

按行排序:-n 数值、-r 逆序、-u 去重、-k 指定键、-t 指定分隔符、-h 人类数字、-V 版本号。

Linux 运维命令速查系统更新于 2026-10-13

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 后结果对不上。

易错点

  • 不带 -n 时按字典序,10 会排在 2 前面,纯数字排序必须选对 -n、-h 或 -V
  • locale 影响比较与去重结果(大小写、重音字符),脚本要提高可复现性就固定 LC_ALL=C
  • -k2 与 -k2,2 语义不同,前者把第 2 段及其后全部纳入比较,多列排序时极易写错
  • sort 会写临时文件,TMPDIR 空间不足时报 cannot create temporary file,大文件先看磁盘余量
  • 相等行的顺序默认不保证,需要稳定输出就加 -s

数据来源与参考

  • man 1 sort(GNU coreutils 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌