主题
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.txttext
10
100
2
33
7坑来了:默认按字符逐位比较,
10开头是1,比2小,所以 10、100 排在 2 前面。排数字必须加-n。
示例 2:按数值大小排序
bash
sort -n nums.txttext
2
7
10
33
100这才是你想要的"从小到大"。
示例 3:逆序(从大到小)
bash
sort -nr nums.txttext
100
33
10
7
2
-n按数字、-r反过来,-nr是"数字从大到小"的高频组合。
示例 4:排序并去重
bash
sort -u demo.txttext
apple
banana
cherry
date
demo.txt里 apple 出现 3 次、banana 2 次;-u排序后重复的只留一条。等价于sort | uniq。
示例 5:按 CSV 的某一列排序
users.csv 内容是 名字,年龄,城市:
bash
sort -t, -k2 -n users.csvtext
bob,25,shanghai
dave,28,guangzhou
alice,30,beijing
carol,35,beijing
-t,指定逗号为分隔符,-k2按第 2 列(年龄)排,-n按数字。结果按年龄从小到大排列。
示例 6:按人类可读单位排序
bash
sort -h humans.txttext
500B
10K
2M
1G配合
du -h、df -h的输出排序时用-h,它能看懂K/M/G。
示例 7:按版本号自然排序
bash
sort -V vers.txttext
v1.2
v1.9
v1.10
v2.0注意
v1.10正确排在v1.9后面——这是-V的功劳,字典序会把它排在最前面。
示例 8:检查文件是否已排序
bash
sort -c nums.txttext
sort: nums.txt:4: disorder: 100
-c只检查不重排,发现第 4 行100是乱序点,退出码非 0。脚本里常用来校验数据。
示例 9:把排序结果写回文件
bash
sort -n nums.txt -o sorted_nums.txt
cat sorted_nums.txttext
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,无差异。
七、新手易错点
- 排数字忘了
-n:最常见的坑,导致10排在2前面。 sort不改原文件:它只输出到屏幕,想保存要-o或>。- 别
sort 文件 > 文件:这会先清空文件!要写回用-o。 -k默认按空白分列:CSV 要先-t,指定分隔符,否则整行当一列。-u是"排序后去重":它和uniq不同,sort -u不要求相邻。- locale 不一致结果不同:脚本里用
LC_ALL=C保证可复现。
八、相关命令与文档
- 速查页:Linux 命令速查
- 排序后去重计数:
uniq(详解见 uniq) - 统计行数:
wc(详解见 wc) - 按列提取字段:
awk(详解见 awk) - 管道与重定向:见 重定向与管道