Skip to content

sort 命令详解:给文本行排序 ​

本文是 Linux 命令速查 中 sort 的从 0 到 1 详解。 目标:把 sort --help 里的每个选项讲清楚,多看几遍后,你在服务器上敲 sort --help 就知道该用哪个选项。 环境依据:GNU coreutils 8.32(Ubuntu 22.04 自带;RHEL/Rocky 自带版本用法一致)。

一、命令是干什么的 ​

sort 用来把文本的每一行按某种规则排好序后输出。它不改动原文件,只是把排序结果打到屏幕(或重定向到新文件)。

  • 默认按字典序(字母/字节顺序)排;
  • 加 -n 按数字大小排;
  • 加 -k 可以按**某一列(字段)**排,比如按 CSV 的第 2 列年龄排;
  • 加 -u 排序顺便去重。

类比:sort 就像 Excel 里"按某一列升序/降序排序",只不过它面向纯文本的行,而且能接在管道后面,把任何命令的输出排个序。

它属于 GNU coreutils,和 uniq(去重)是黄金搭档:先 sort 再 uniq。

二、命令语法 ​

bash
sort [选项]... [文件]...
  • [选项]:可选,决定按什么规则排(数字?字段?逆序?);
  • [文件]:可选,要排序谁;不写就从标准输入读(常用于管道)。

排序结果默认输出到屏幕,不改原文件;想存起来用 -o 文件 或 > 重定向。

三、选项全表(对照 sort --help) ​

1. 按什么规则排序(排序方式) ​

选项中文含义什么场景用
-n,--numeric-sort按数值大小排序数字排序(最常用,否则 10 会排在 2 前面)
-r,--reverse逆序(从大到小 / 从 Z 到 A)想要降序时
-h,--human-numeric-sort按人类可读数字排(2K、1G)排 du -h 那种带单位的大小时
-V,--version-sort按版本号自然排序(v1.10 > v1.9)文件名带版本号时
-f,--ignore-case忽略大小写排序Apple 和 apple 视为相同
-M,--month-sort按月份排(JAN < FEB < ...)排英文月份名时
-g,--general-numeric-sort按通用数值(支持科学计数法)排数字带 e 指数时
-R,--random-sort随机打乱(相同行仍分到一起)想随机抽样时
-d,--dictionary-order字典序,只考虑字母数字空格忽略标点时
-b,--ignore-leading-blanks忽略行首空格行首缩进不影响排序时
--sort=WORD用长选项指定上面的排序方式脚本里写清楚用哪种

2. 按哪一列排(字段 / 键) ​

选项中文含义什么场景用
-t 分隔符,--field-separator=SEP指定字段分隔符(默认是空白)排 CSV 时用 -t,
-k 位置,--key=KEYDEF按第几个字段作为排序键最常用:-k2 按第 2 列
-u,--unique排序后相同的行只留一条排序顺便去重

-k 可以精细到字段里的第几个字符,如 -k2,2n 表示"用第 2 列、按数字排"。

3. 输出与其他 ​

选项中文含义什么场景用
-o 文件,--output=文件把排序结果写入文件(而不是屏幕)想把排序结果写回文件时
-c,--check只检查文件是否已排序,不真排脚本里校验是否有序
-C同 -c,但不报告具体哪行乱脚本里只要退出码
-m合并已经排好序的多个文件多个有序文件合并时
-s,--stable稳定排序(相同键保持原顺序)需要稳定排序时
-S 大小,--buffer-size=大小指定排序用的内存缓冲排超大文件调优时
-T 目录,--temporary-directory=目录指定临时文件目录默认 /tmp 不够大时
--parallel=N用 N 个线程并行排大文件提速
-z,--zero-terminated行分隔符是 NUL配合 find -print0 时

四、由浅入深的典型示例 ​

演示文件在 /tmp/sre_shard_txt。nums.txt 内容是:10 / 2 / 33 / 100 / 7。

示例 1:默认字典序排序(有坑) ​

bash
sort nums.txt
text
10
100
2
33
7

坑来了:默认按字符逐位比较,10 开头是 1,比 2 小,所以 10、100 排在 2 前面。排数字必须加 -n。

示例 2:按数值大小排序 ​

bash
sort -n nums.txt
text
2
7
10
33
100

这才是你想要的"从小到大"。

示例 3:逆序(从大到小) ​

bash
sort -nr nums.txt
text
100
33
10
7
2

-n 按数字、-r 反过来,-nr 是"数字从大到小"的高频组合。

示例 4:排序并去重 ​

bash
sort -u demo.txt
text
apple
banana
cherry
date

demo.txt 里 apple 出现 3 次、banana 2 次;-u 排序后重复的只留一条。等价于 sort | uniq。

示例 5:按 CSV 的某一列排序 ​

users.csv 内容是 名字,年龄,城市:

bash
sort -t, -k2 -n users.csv
text
bob,25,shanghai
dave,28,guangzhou
alice,30,beijing
carol,35,beijing

-t, 指定逗号为分隔符,-k2 按第 2 列(年龄)排,-n 按数字。结果按年龄从小到大排列。

示例 6:按人类可读单位排序 ​

bash
sort -h humans.txt
text
500B
10K
2M
1G

配合 du -h、df -h 的输出排序时用 -h,它能看懂 K/M/G。

示例 7:按版本号自然排序 ​

bash
sort -V vers.txt
text
v1.2
v1.9
v1.10
v2.0

注意 v1.10 正确排在 v1.9 后面——这是 -V 的功劳,字典序会把它排在最前面。

示例 8:检查文件是否已排序 ​

bash
sort -c nums.txt
text
sort: nums.txt:4: disorder: 100

-c 只检查不重排,发现第 4 行 100 是乱序点,退出码非 0。脚本里常用来校验数据。

示例 9:把排序结果写回文件 ​

bash
sort -n nums.txt -o sorted_nums.txt
cat sorted_nums.txt
text
2
7
10
33
100

-o 直接写回文件。注意:不能写成 sort -n nums.txt > nums.txt(那会先把文件清空),要写就用 -o 或写到别的文件。

五、高频组合速记 ​

命令用途
sort -n 文件按数字从小到大
sort -nr 文件按数字从大到小
sort -u 文件排序 + 去重
sort -t, -k2 -n 文件按 CSV 第 2 列数字排
sort -h排带 K/M/G 的大小
sort -V排版本号
sort 文件 | uniq -c | sort -nr统计词频并按次数倒序
命令 | sort把命令输出排序

六、RHEL 系与 Debian 系差异 ​

sort 属于 GNU coreutils,两系用法一致。一个重要提醒(跨发行版通用):

  • locale 影响排序结果:不同语言环境下字典序可能不同。要得到最稳定的"按字节"排序,脚本里设 LC_ALL=C sort。
  • 包名都是 coreutils,无差异。

七、新手易错点 ​

  1. 排数字忘了 -n:最常见的坑,导致 10 排在 2 前面。
  2. sort 不改原文件:它只输出到屏幕,想保存要 -o 或 >。
  3. 别 sort 文件 > 文件:这会先清空文件!要写回用 -o。
  4. -k 默认按空白分列:CSV 要先 -t, 指定分隔符,否则整行当一列。
  5. -u 是"排序后去重":它和 uniq 不同,sort -u 不要求相邻。
  6. locale 不一致结果不同:脚本里用 LC_ALL=C 保证可复现。

八、相关命令与文档 ​