sort是Linux/Unix系统中用于对文本文件行进行排序的标准工具。它能够按照字母顺序、数字顺序、月份顺序等多种规则对文件内容或标准输入进行排序,支持按字段排序、去除重复行、合并已排序文件等高级功能。
sort是命令行数据处理的核心组件之一,常与uniq、cut、awk等工具配合使用,用于日志分析、数据统计、结果整理等场景。sort支持外部排序算法,即使处理超大文件(大于内存)也能高效完成。掌握sort是进行文本数据处理和数据分析的基础技能。
1. 基本语法
| 命令 | 说明 |
|---|
sort file.txt | |
sort -r file.txt | |
sort -n file.txt | |
sort -nr file.txt | |
sort file1.txt file2.txt | |
sort -m file1.txt file2.txt | |
2. 按字段排序
| 命令 | 说明 |
|---|
sort -k2 file.txt | |
sort -k2,2 file.txt | |
sort -t: -k3,3n /etc/passwd | |
sort -t, -k1,1 data.csv | |
sort -k3,3 -k1,1 file.txt | |
sort -k2nr file.txt | |
字段分隔符说明:
3. 数值与大小排序
| 命令 | 说明 |
|---|
sort -n numbers.txt | |
sort -g values.txt | |
sort -h sizes.txt | |
du -sh /var/* | sort -h | |
sort -V versions.txt | |
ls -1 | sort -V | |
数值排序对比:
# 字母排序(默认):1, 10, 2, 20, 3
# 数值排序(-n):1, 2, 3, 10, 20
# 版本排序(-V):1.2, 1.10, 2.0
4. 去重与检查
| 命令 | 说明 |
|---|
sort -u file.txt | |
sort file.txt | uniq | |
sort file.txt | uniq -c | |
sort -c file.txt | |
sort -C file.txt | |
sort -u -o output.txt input.txt | |
退出码说明:
5. 原地输出与输出控制
| 命令 | 说明 |
|---|
sort file.txt > sorted.txt | |
sort -o file.txt file.txt | |
sort -o out.txt in.txt | |
sort -T /tmp bigfile.txt | |
LC_ALL=C sort file.txt | |
sort -s file.txt | |
重要提示:
# 危险!会清空文件
sort file.txt > file.txt
# 正确做法
sort -o file.txt file.txt
6. 实用管道组合
| 命令 | 说明 |
|---|
grep -Eo '[[:alnum:]_]+' file.txt | sort | uniq -c | sort -rn | |
cut -d',' -f2 data.csv | sort | |
sort access.log | uniq -c | sort -rn | head -10 | |
ps -eo user= | sort | uniq -c | sort -rn | |
find . -type f | sort | |
ls -la | sort -k5 -n | |
history | awk '{print $2}' | sort | uniq -c | sort -rn | head | |
7. 字段排序高级技巧
| 命令 | 说明 |
|---|
sort -k2.2,2.3 file.txt | |
sort -t: -k3,3 -k4,4n /etc/passwd | |
sort -t, -k2,2nr data.csv | |
sort -k1,1 -k2,2n file.txt | |
sort -k1r -k2n file.txt | |
sort --debug -k2 file.txt | |
8. 常用选项速查
| 选项 | 完整名称 | 说明 |
|---|
-r | | |
-n | | |
-g | | |
-h | | |
-V | | |
-u | | |
-c | | |
-C | | |
-k | | |
-t | | |
-o | | |
-s | | |
-f | | |
-b | | |
-T | | |
-m | | |
9. Locale对排序的影响
| 设置 | 说明 |
|---|
LC_ALL=C | |
LC_ALL=en_US.UTF-8 | |
LC_ALL=zh_CN.UTF-8 | |
export LC_ALL=C | |
示例:
# 确保可预测的排序行为
LC_ALL=C sort file.txt
10. 实用组合模式
| 命令 | 说明 |
|---|
sort -t' ' -k2n /proc/meminfo | |
sort -k1,1 -t: /etc/passwd | cut -d: -f1,3 | |
df -h | sort -k5 -h | |
ls -l | sort -k5 -n | tail -5 | |
sort -R file.txt | |
sort -t$'\t' -k2n data.tsv | |
comm -12 <(sort file1) <(sort file2) | |
11. 故障排查
| 问题 | 解决方法 |
|---|
| 数字被当作文本排序 | |
| 大小值顺序不正确 | |
| 大小写顺序不符合预期 | |
执行sort file > file后文件变空 | sort先打开输出文件导致清空,使用sort -o file file |
| 不同系统排序结果不同 | |
| 大文件排序内存不足 | |
| 字段分隔符不生效 | 检查实际分隔符(Tab需用$'\t'表示);使用-t指定 |
| 多级排序不按预期工作 | 使用--debug查看排序键解析;检查-k选项边界 |
温馨提示: sort是数据处理的核心工具,建议掌握以下技巧:1)处理CSV/TSV文件时使用-t指定分隔符;2)日志分析时结合uniq统计频率,再用sort -rn找出最高频条目;3)使用sort -o原地排序避免重定向陷阱;4)跨环境使用LC_ALL=C确保排序结果一致。在脚本中使用sort时,可以通过-c检查输入是否已排序,避免不必要的排序操作。对于超大文件,sort的自动外部排序机制非常可靠,只需确保-T指定的临时目录有足够空间。