概述
sort 命令,这个命令是文本排序的核心工具 ,能对文件内容或命令输出按行进行排序(字母、数字、时间等规则),还支持按指定列、自定义分隔符、去重等高级操作,是处理结构化文本、日志、数据清单的必备命令,也是 join、uniq 等命令的前置依赖(很多命令要求输入已排序)。
资料合集:https://pan.quark.cn/s/6fe3007c3e95、https://pan.quark.cn/s/561de99256a5、https://pan.quark.cn/s/985f55b13d94、https://pan.quark.cn/s/d0fb20abd19a
一、基本语法
bash
sort [选项] [文件1] [文件2] ...
- 无文件参数时,默认读取标准输入 (可配合管道
|处理其他命令输出); - 默认按每行的字符ASCII码值升序排序(字母A-Z、数字0-9);
- 多文件排序时,会先拼接所有文件内容,再整体排序。
二、核心选项(按功能分类)
sort 的选项覆盖排序规则、字段配置、输出控制,高频选项易记且组合性强:
| 选项分类 | 选项 | 作用 | 实用场景 |
|---|---|---|---|
| 排序方向 | |||
-r |
--reverse |
降序排序(默认升序) | 按数字从大到小、时间从新到旧排序 |
-n |
--numeric-sort |
按数字值排序(而非字符ASCII) | 排序大小、金额、行数等数字列 |
-h |
--human-numeric-sort |
按人类可读的数字(如1K、2M、3G)排序 | 排序du -h、ls -lh的输出 |
-V |
--version-sort |
按版本号排序(如v1.10 > v1.9) | 排序软件版本、文件版本号 |
| 字段/分隔符配置(核心) | |||
-t "字符" |
--field-separator=字符 |
指定字段分隔符(默认空格/制表符) | 处理CSV(逗号分隔)、竖线分隔的文本 |
-k N |
--key=N |
指定按第N列排序(可指定列范围,如-k2,3) |
按指定列(如用户ID、金额列)排序 |
-k N,M |
------ | 按第N列到第M列排序 | 多列组合排序(如先按城市、再按年龄) |
-k Nn |
------ | 第N列按数字排序(组合选项) | 列是数字时,避免按字符排序 |
| 输出控制 | |||
-u |
--unique |
排序并去重(仅保留唯一行) | 去重文本、统计唯一值 |
-o 文件 |
--output=文件 |
将排序结果输出到指定文件(替代重定向>) |
排序后覆盖原文件(sort -o file file) |
-s |
--stable |
稳定排序(相同键值的行保持原顺序) | 需保留原始相对顺序的场景 |
-f |
--ignore-case |
忽略大小写(如A和a视为相同) | 字母排序时统一大小写规则 |
三、基础示例(快速上手)
先准备测试文件 test.txt:
txt
banana
Apple
cherry
100
20
3
hello
Hello
场景1:默认排序(ASCII码升序)
bash
sort test.txt
输出(数字<大写字母<小写字母,ASCII码顺序):
100
20
3
Apple
Hello
banana
cherry
hello
场景2:数字排序(-n)+ 降序(-r)
bash
sort -n -r test.txt
# 优先按数字降序,非数字行按原规则排
输出:
100
20
3
cherry
hello
banana
Hello
Apple
场景3:忽略大小写排序(-f)
bash
sort -f test.txt
输出(A/a、H/h视为相同,按字母顺序):
100
20
3
Apple
banana
cherry
Hello
hello
场景4:排序并去重(-u)
bash
# 新增重复行后测试
echo -e "apple\nApple\napple" | sort -f -u
# 输出:apple(忽略大小写+去重)
四、进阶示例(结构化文本排序,核心场景)
准备结构化文件 user.csv(逗号分隔:姓名,年龄,城市,薪资):
txt
张三,25,北京,8000
李四,30,上海,15000
王五,28,北京,10000
赵六,35,广州,12000
钱七,25,上海,9000
场景1:按指定列排序(按城市+薪资降序)
bash
# -t ",":分隔符为逗号
# -k3,3:按第3列(城市)排序
# -k4nr:按第4列(薪资)数字降序
sort -t "," -k3,3 -k4nr user.csv
输出(先按城市字母序,同城市按薪资降序):
李四,30,上海,15000
钱七,25,上海,9000
王五,28,北京,10000
张三,25,北京,8000
赵六,35,广州,12000
场景2:处理人类可读数字(-h)
bash
# 模拟du -h输出
echo -e "100K\ndata\n2M\n1G\n500K" | sort -h
输出(按大小升序:100K < 500K < 2M < 1G):
100K
500K
2M
1G
data
场景3:版本号排序(-V)
bash
echo -e "v1.9\nv1.10\nv2.1\nv1.8.1" | sort -V
输出(按版本号自然顺序):
v1.8.1
v1.9
v1.10
v2.1
场景4:排序后覆盖原文件(-o)
直接排序并替换原文件(避免sort file > file导致文件清空):
bash
sort -t "," -k2n -o user.csv user.csv
# 按年龄升序排序,结果覆盖原文件
五、关键注意事项
- 分隔符处理 :
- 若字段分隔符是多个空格/制表符混合 ,无需指定
-t,sort默认将连续空白视为一个分隔符; - CSV文件若含引号(如
"张三,男",25),sort无法识别,需先用sed/awk处理引号。
- 若字段分隔符是多个空格/制表符混合 ,无需指定
- 空行处理 :默认空行排在最前面,可通过
grep -v "^$"先过滤空行再排序。 - 稳定排序 :默认排序在键值相同时,行顺序可能随机,加
-s可保持原始相对顺序。 - 超大文件 :
sort会自动使用临时文件,支持GB级文件排序,无需担心内存不足。 - 与uniq配合 :
uniq仅能去重连续重复行 ,需先sort再uniq(sort file | uniq),等价于sort -u file。
六、高频组合用法
1. 统计日志中出现次数最多的IP
bash
# 提取IP列 → 排序 → 去重并计数 → 按次数降序
grep -o "\b[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\b" access.log | sort | uniq -c | sort -nr
2. 按文件大小排序(ls -lh + sort)
bash
ls -lh | grep -v "^total" | sort -k5h -r
# -k5h:按第5列(文件大小)人类可读降序
3. 排序后关联数据(sort + join)
bash
# 先排序两个文件,再join
sort file1.txt -o file1_sorted.txt
sort file2.txt -o file2_sorted.txt
join file1_sorted.txt file2_sorted.txt
总结
sort 是文本排序的万能工具 ,核心价值是自定义规则排序文本行,日常高频用法:
- 基础排序:
sort 文件名(升序)、sort -r 文件名(降序); - 数字排序:
sort -n 文件名、sort -nr 文件名(数字降序); - 按列排序:
sort -t "分隔符" -k N 文件名; - 去重排序:
sort -u 文件名(等价sort | uniq); - 特殊排序:
sort -h(人类可读数字)、sort -V(版本号)。