排序命令是 Linux/Unix 和 Windows 系统中非常基础且强大的工具,主要用于将文本文件的行或数据按特定规则进行排序。

我们将主要讲解 Linux/Unix 中的 sort 命令,因为它功能最全面,然后再介绍 Windows 中的 sort 命令,它们的核心思想是相通的。
Linux/Unix 中的 sort 命令
sort 命令的默认行为是:
- 按行对文件内容进行排序。
- 使用系统的本地化语言设置来确定排序顺序(在大多数现代系统上,这等同于按字典序排序,即
LC_COLLATE=C)。 - 将排序结果输出到标准输出(通常是终端),而不是修改原文件。
基本用法
最简单的用法就是直接对文件进行排序。
示例文件 names.txt:

Charlie
Alice
Eve
Bob
David
命令:
sort names.txt
输出:
Alice
Bob
Charlie
David
Eve
常用选项
sort 命令的强大之处在于其丰富的选项。
a) 指定排序字段
有时你不想对整行排序,而是想对行中的某个特定部分(字段)进行排序,可以使用 -k (key) 选项。

-k field_number: 指定按第几个字段排序。- 字段默认由空白字符(空格、制表符)分隔。
示例文件 users.txt:
Alice 30
Charlie 25
Eve 28
Bob 35
David 22
命令: 按第二列(年龄)排序
sort -k 2 users.txt
输出:
David 22
Charlie 25
Eve 28
Alice 30
Bob 35
命令: 按第一列(姓名)排序
sort -k 1 users.txt
这个结果和 sort users.txt 是一样的。
b) 指定分隔符
如果你的文件不是用空格或制表符分隔的,而是用逗号、冒号等,可以使用 -t (field separator) 选项。
示例文件 data.csv:
Alice,30,New York
Charlie,25,Los Angeles
Eve,28,Chicago
Bob,35,Houston
David,22,Phoenix
命令: 按逗号分隔,并按第二列(年龄)排序
sort -t ',' -k 2 data.csv
输出:
David,22,Phoenix
Charlie,25,Los Angeles
Eve,28,Chicago
Alice,30,New York
Bob,35,Houston
c) 逆序排序
使用 -r (reverse) 选项可以将排序结果反转。
命令: 按年龄降序排序
sort -r -k 2 users.txt
输出:
Bob 35
Alice 30
Eve 28
Charlie 25
David 22
d) 数值排序
默认情况下,sort 会将数字作为字符串处理,这意味着 "10" 会排在 "2" 的前面,因为字符 '1' 的 ASCII 码小于 '2'。
要按数值大小排序,必须使用 -n (numeric) 选项。
示例文件 numbers.txt:
10
2
20
1
命令: 字符串排序(默认)
sort numbers.txt
输出:
1
10
2
20
命令: 数值排序
sort -n numbers.txt
输出:
1
2
10
20
e) 忽略大小写
默认情况下,大写字母(A-Z)的 ASCII 码比小写字母(a-z)小,"Z" 会排在 "a" 的前面,要忽略大小写进行排序,使用 -f (fold) 选项。
示例文件 mixed.txt:
banana
Apple
cherry
Banana
命令: 默认排序
sort mixed.txt
输出:
Apple
Banana
banana
cherry
命令: 忽略大小写排序
sort -f mixed.txt
输出:
Apple
banana
Banana
cherry
(注意:-f 不会改变原文件中的大小写,只是排序时忽略它。)
f) 其他实用选项
-u(unique): 合并重复的行,这相当于先排序,然后用uniq命令去重。sort -u file_with_duplicates.txt
-o file(output): 将排序结果输出到指定的文件,而不是终端。sort -n -o sorted_users.txt users.txt
-m(merge): 将多个已排序的文件合并成一个单一的已排序文件,这比将所有文件内容连接起来再排序要快得多。sort -m file1_sorted.txt file2_sorted.txt > merged_sorted.txt
综合示例
假设有一个日志文件 access.log,格式为 IP 地址 - 请求时间 "状态码",我们想找出访问次数最多的 IP 地址。
示例 access.log:
168.1.100 - [10/Oct/2025:13:55:36 +0000] "200"
10.0.0.5 - [10/Oct/2025:13:56:01 +0000] "200"
192.168.1.100 - [10/Oct/2025:13:56:15 +0000] "404"
10.0.0.5 - [10/Oct/2025:13:57:22 +0000] "200"
192.168.1.100 - [10/Oct/2025:13:58:00 +0000] "200"
目标:
- 提取所有 IP 地址(第一列)。
- 对 IP 地址进行排序(
sort)。 - 合并重复的 IP 地址(
sort -u或uniq)。 - 统计每个 IP 地址出现的次数(
uniq -c)。 - 按访问次数从高到低排序(
sort -nr)。
命令:
# 1. 提取第一列 # 2. 排序 # 3. 合并重复行并计数 # 4. 按数字逆序排序(第一列是计数) cut -d ' ' -f 1 access.log | sort | uniq -c | sort -nr
输出:
3 192.168.1.100
2 10.0.0.5
这个命令是 Linux 命令行“管道”和“组合”使用的经典范例。
Windows 中的 sort 命令
Windows 命令提示符(CMD)和 PowerShell 中也内置了 sort 命令,但其语法和功能比 Linux 版本简单得多。
基本用法
与 Linux 类似,直接对文件进行排序。
命令:
sort names.txt
主要选项
Windows sort 的选项大多使用单个斜杠 。
/R: 逆序排序(相当于 Linux 的-r)。/N: 按字符串中的数值进行排序(相当于 Linux 的-n)。/+n: 跳过每行的前n个字符,然后对剩余部分进行排序,这可以用来模拟按特定字段排序,但功能有限。/O filename: 将输出重定向到文件(相当于 Linux 的-o)。
示例文件 users.txt 与之前相同:
Alice 30
Charlie 25
Eve 28
Bob 35
David 22
命令: 按年龄(第二列)排序
Windows sort 没有直接的字段分隔符选项,一个变通方法是使用 跳过第一列和它后面的空格。
"Alice 30" 中,"Alice" 占 5 个字符,后面是 1 个空格,所以我们要跳过 6 个字符。
sort /+6 users.txt
输出:
David 22
Charlie 25
Eve 28
Alice 30
Bob 35
命令: 按年龄降序排序
sort /R /+6 users.txt
与 Linux 的对比总结
| 功能 | Linux sort |
Windows sort |
|---|---|---|
| 逆序排序 | -r |
/R |
| 数值排序 | -n |
/N |
| 输出到文件 | -o file |
/O file |
| 指定分隔符 | -t |
不支持 |
| 指定字段 | -k |
不支持 (但有 /+n 跳过字符) |
| 忽略大小写 | -f |
不支持 |
| 合并重复行 | -u |
不支持 |
可以看出,Linux/Unix 的 sort 命令要强大和灵活得多,尤其是在处理结构化文本数据时。
- 核心功能:
sort命令用于对文本行进行排序。 - 关键选项:
-k(Linux): 按指定字段排序,是功能的核心。-n(Linux/Windows): 按数值排序,处理数字时必备。-r(Linux) //R(Windows): 逆序排序。-t(Linux): 指定字段分隔符,配合-k使用威力巨大。
- 最佳实践:
sort命令很少单独使用,它通常是管道 () 中的一个环节,与其他命令如cut,uniq,grep等组合,完成复杂的数据处理任务。
熟练掌握 sort 命令是提升命令行操作效率的重要一步。
