
sort命令用于对文本文件的行进行排序,它是文本处理和数据分析中最常用、最重要的命令之一。
命令功能
排序行:对文本文件的每一行进行排序。
去重:识别并删除重复的行。
检查排序:验证文件是否已排序。
合并文件:在排序的同时合并多个已排序的文件。
命令语法
如果不指定文件,则从标准输入读取数据。
可以指定多个文件,sort会将它们的内容连接起来一起排序。
常用选项
sort的选项非常丰富,以下是核心选项:
排序控制选项
选项 | 全称 | 说明 |
|---|
-r
| --reverse
| 反向排序。降序排列(默认是升序)。 |
-f
| --ignore-case
| 忽略大小写。排序时不区分大小写。 |
-n
| --numeric-sort
| 按数值大小排序。而不是按字符串顺序(避免 "10" 排在 "2" 前面)。 |
-h
| --human-numeric-sort
| 人类可读的数值排序。能正确排序如 "2K", "1M", "1G" 这样的带单位数值。 |
-R
| --random-sort
| 随机排序。打乱行的顺序。 |
-V
| --version-sort
| 版本号排序。能正确排序软件版本号如 "1.2", "1.10", "2.0"。 |
-M
| --month-sort
| 按月份名称排序。识别 "JAN", "FEB" 等月份缩写。 |
字段处理选项
选项 | 全称 | 说明 |
|---|
-k
| --key=KEYDEF
| 指定排序键。按指定的字段或字符位置排序,而不是整行。 |
-t
| --field-separator=SEP
| 指定字段分隔符。默认是空白字符(空格、制表符)。 |
-b
| --ignore-leading-blanks
| 忽略前导空白。排序时忽略行首的空格。 |
输出控制选项
选项 | 全称 | 说明 |
|---|
-u
| --unique
| 去重。只输出唯一的行,删除重复项。 |
-c
| --check
| 检查是否已排序。如果文件未排序,报告第一个乱序的位置。 |
-m
| --merge
| 合并已排序的文件。将多个已排序的文件合并为一个排序文件。 |
-o
| --output=FILE
| 输出到文件。将结果写入指定文件,而不是标准输出。 |
-s
| --stable
| 稳定排序。保持相等记录的原始相对顺序。 |
常用示例
假设我们有一个文件 data.txt:
banana
Apple
orange
10
2
cherry
Banana
1. 基本排序(按字符串ASCII顺序)
输出:
10
2
Apple
Banana
banana
cherry
orange
注意:数字被当作字符串排序,所以 "10" 在 "2" 前面。
2. 忽略大小写排序 (-f)
输出:
10
2
Apple
banana
Banana
cherry
orange
"Apple", "banana", "Banana" 按忽略大小写的顺序排列。
3. 按数值大小排序 (-n)
输出:
2
10
Apple
Banana
banana
cherry
orange
现在数字按数值大小正确排序了。
4. 反向排序 (-r)
输出:
orange
cherry
banana
Banana
Apple
2
10
5. 去重排序 (-u)
输出:
10
2
Apple
Banana
banana
cherry
orange
注意:-u是严格比较,Banana和 banana被视为不同。
6. 去重且忽略大小写
输出:
10
2
Apple
banana
cherry
orange
现在 Banana被当作 banana的重复项删除了。
7. 检查文件是否已排序 (-c)
输出:
sort: data.txt:2: disorder: Apple
报告第2行开始出现乱序。
高级用法:按字段排序
假设我们有一个带字段的文件 employees.txt:
Smith John 35000
Doe Jane 42000
Brown Bob 38000
Adams Alice 42000
8. 指定字段分隔符和排序键 (-t和 -k)
按第三列(薪资)数值降序排序:
sort -t ' ' -k 3nr employees.txt
输出:
Doe Jane 42000
Adams Alice 42000
Brown Bob 38000
Smith John 35000
-t ' '指定空格为分隔符,-k 3nr表示按第3字段数值降序排序。
按姓氏(第1字段)排序:
sort -t ' ' -k 1 employees.txt
输出:
Adams Alice 42000
Brown Bob 38000
Doe Jane 42000
Smith John 35000
9. 复杂键定义
按薪资降序,薪资相同的按姓氏升序:
sort -t ' ' -k 3nr -k 1 employees.txt
输出:
Adams Alice 42000
Doe Jane 42000
Brown Bob 38000
Smith John 35000
10. 按字符位置排序
假设文件 codes.txt:
按第4-6字符(数字部分)排序:
sort -k 1.4,1.6 codes.txt
输出:
实用场景示例
场景一:分析日志文件
找出访问量最大的IP地址:
# 假设日志格式: IP - - [date] "request" status size
cut -d' ' -f1 access.log | sort | uniq -c | sort -nr | head -10
1. 提取IP → 2. 排序 → 3. 计数去重 → 4. 按访问量降序 → 5. 显示前10
场景二:处理CSV数据
对CSV文件按第二列数值排序:
sort -t ',' -k 2n data.csv
场景三:整理单词列表
清理单词列表并排序:
# 转小写 → 排序 → 去重
cat words.txt | tr'A-Z''a-z' | sort -u > cleaned_words.txt
场景四:随机洗牌
打乱列表顺序(如抽奖名单):
场景五:版本号排序
正确排序软件版本:
cat versions.txt
# 1.2
# 1.10
# 1.1
# 2.0
sort -V versions.txt
# 输出:
# 1.1
# 1.2
# 1.10
# 2.0
场景六:检查配置文件重复项
找出配置文件中重复的配置行:
sort configfile | uniq -d
性能提示
内存使用:sort需要在内存中处理数据,非常大的文件可能消耗大量内存。
临时文件:当内存不足时,sort会使用临时文件。
并行排序:某些版本的 sort支持 --parallel选项来使用多个CPU核心。
缓冲区大小:可以使用 -S或 --buffer-size调整内存使用量。
总结来说,sort是:
数据处理流水线中的关键组件
日志分析的必备工具
文本处理的强大武器
系统管理的常用命令
掌握 sort及其选项的组合使用,能极大地提高你在命令行下处理数据的效率。