sort 命令详解#
sort 是 Linux 系统中用于对文本行进行排序的命令。它可以根据字母顺序、数字顺序、月份顺序等多种方式对文本进行排序,是文本处理和数据整理的重要工具。
入门#
基本用法#
# 基本排序(按字母顺序)
sort filename.txt
# 对多个文件排序并合并
sort file1.txt file2.txt
# 从标准输入排序
cat file.txt | sort
command | sort常用选项#
| 选项 | 说明 |
|---|---|
-r | 反向排序(降序) |
-n | 按数值排序 |
-k | 指定排序字段 |
-t | 指定字段分隔符 |
-u | 去除重复行 |
-f | 忽略大小写 |
-b | 忽略前导空格 |
-o | 将结果写入文件 |
基本示例#
# 按字母顺序排序
sort names.txt
# 反向排序
sort -r names.txt
# 数值排序
sort -n numbers.txt
# 去除重复行
sort -u names.txt
# 忽略大小写排序
sort -f names.txt中级#
字段排序#
# 按第2个字段排序
sort -k2 filename.txt
# 按第2个字段数值排序
sort -k2n filename.txt
# 按第2个字段反向排序
sort -k2r filename.txt
# 按第2到第4个字段排序
sort -k2,4 filename.txt
# 按第2个字段数值,第3个字段字母排序
sort -k2n -k3 filename.txt分隔符使用#
# 使用冒号作为分隔符
sort -t: -k3 /etc/passwd
# 使用逗号作为分隔符
sort -t, -k2 data.csv
# 使用制表符作为分隔符
sort -t$'\t' -k2 data.tsv
# 示例:按UID排序用户
sort -t: -k3n /etc/passwd输出控制#
# 将结果写入文件
sort -o sorted.txt input.txt
# 检查文件是否已排序
sort -c filename.txt
# 只显示重复行
sort -d filename.txt
# 只显示不重复的行
sort -u filename.txt
# 合并已排序的文件
sort -m sorted1.txt sorted2.txt高级选项#
# 按月份排序
sort -M months.txt
# 按版本号排序
sort -V versions.txt
# 随机排序
sort -R filename.txt
# 按人类可读的数字排序(1K, 2M, 3G)
sort -h sizes.txt
# 指定排序字符集
sort --locale=C filename.txt高级#
复杂排序#
# 按第2个字段数值排序,第1个字段字母排序
sort -k2n -k1 filename.txt
# 按第2个字段第3个字符开始排序
sort -k2.3 filename.txt
# 按第2个字段第3到第5个字符排序
sort -k2.3,2.5 filename.txt
# 复杂示例:按第2个字段数值,第3个字段反向字母排序
sort -k2n -k3r filename.txt稳定排序#
# 稳定排序(保持相同键的原始顺序)
sort -s filename.txt
# 示例:先按第2个字段排序,再按第1个字段稳定排序
sort -k2n -s -k1 filename.txt自定义排序#
# 指定排序键的起始和结束位置
sort -k1.1,1.5 filename.txt
# 使用多个排序键
sort -k1n -k2 -k3r filename.txt
# 排除某些字段
sort -k1,1 -k3,3 filename.txt性能优化#
# 指定临时目录
sort -T /tmp largefile.txt
# 指定缓冲区大小
sort -S 100M largefile.txt
# 并行排序
sort --parallel=4 largefile.txt
# 使用外部排序(大文件)
sort --external-sort largefile.txt大师#
高级数据处理#
# 按IP地址排序
sort -t. -k1,1n -k2,2n -k3,3n -k4,4n ips.txt
# 按日期排序(YYYY-MM-DD格式)
sort -t- -k1,1n -k2,2n -k3,3n dates.txt
# 按时间排序(HH:MM:SS格式)
sort -t: -k1,1n -k2,2n -k3,3n times.txt
# 按文件大小排序
du -h * | sort -hr复杂示例#
# 分析日志文件
sort -k4 -t' ' access.log | uniq -c | sort -rn
# 统计词频
cat text.txt | tr ' ' '\n' | sort | uniq -c | sort -rn
# 排序CSV文件
sort -t, -k2n -k3 data.csv
# 多条件排序
sort -k2n -k3 -k4r filename.txt与其他命令组合#
# 排序并去重
sort -u filename.txt
# 排序并统计重复次数
sort | uniq -c
# 排序并只显示前N个
sort | head -n 10
# 排序并只显示后N个
sort | tail -n 10
# 排序并显示唯一值
sort | uniq脚本集成#
# 日志分析脚本
#!/bin/bash
LOG_FILE="$1"
echo "Top 10 IP addresses:"
awk '{print $1}' "$LOG_FILE" | sort | uniq -c | sort -rn | head -n 10
# 数据排序脚本
#!/bin/bash
INPUT="$1"
OUTPUT="$2"
sort -t, -k2n -k3 "$INPUT" -o "$OUTPUT"
# 文件去重脚本
#!/bin/bash
sort -u "$1" -o "$1.sorted"
mv "$1.sorted" "$1"无敌#
高级技巧#
# 按多个条件排序,每个条件使用不同的选项
sort -k1,1 -k2n -k3r -k4.2,4.5 filename.txt
# 使用正则表达式作为分隔符
sort -t'[0-9]' -k2 filename.txt
# 按十六进制数字排序
sort -n -t'x' -k2 hex_numbers.txt
# 按科学计数法排序
sort -g scientific_numbers.txt大文件处理#
# 处理超大文件
sort -T /tmp -S 1G --parallel=8 largefile.txt -o sorted.txt
# 分块排序后合并
split -l 1000000 largefile.txt chunk_
for chunk in chunk_*; do
sort "$chunk" -o "$chunk.sorted"
done
sort -m chunk_*.sorted -o final_sorted.txt自动化工作流#
# 自动化数据处理
#!/bin/bash
INPUT_DIR="./input"
OUTPUT_DIR="./output"
mkdir -p "$OUTPUT_DIR"
for file in "$INPUT_DIR"/*.csv; do
filename=$(basename "$file")
sort -t, -k2n -k3 "$file" -o "$OUTPUT_DIR/$filename"
done
# 自动化日志分析
#!/bin/bash
LOG_DIR="/var/log"
REPORT_DIR="./reports"
mkdir -p "$REPORT_DIR"
DATE=$(date +%Y-%m-%d)
find "$LOG_DIR" -name "*$DATE*" -type f | while read log; do
filename=$(basename "$log")
sort -k4 -t' ' "$log" | uniq -c | sort -rn > "$REPORT_DIR/$filename.sorted"
done性能调优#
# 监控排序性能
time sort largefile.txt
# 使用 strace 分析
strace -c sort largefile.txt
# 使用 valgrind 分析内存
valgrind --tool=massif sort largefile.txt
# 优化排序参数
sort --parallel=$(nproc) -S $(free -m | awk '/Mem:/ {print $2}')M largefile.txt高级应用场景#
# 数据库导出数据排序
mysql -u user -p database -e "SELECT * FROM table" | sort -t$'\t' -k2n
# 系统进程排序
ps aux | sort -k3rn
# 网络连接排序
netstat -an | sort -k4
# 磁盘使用排序
df -h | sort -k5rn
# 文件修改时间排序
find . -type f -printf "%T@ %p\n" | sort -n | cut -d' ' -f2-最佳实践#
1. 选择合适的排序方法#
- 文本数据使用默认排序
- 数字数据使用
-n选项 - 人类可读的数字使用
-h选项 - 版本号使用
-V选项
2. 性能优化#
- 对于大文件,指定临时目录和缓冲区大小
- 使用并行排序提高速度
- 合理使用
-m选项合并已排序文件
3. 数据处理#
- 先过滤再排序,减少排序数据量
- 使用
-u去除重复行 - 结合
uniq进行数据统计
4. 脚本集成#
- 在脚本中使用
-o选项输出到文件 - 使用管道与其他命令组合
- 处理错误和异常情况
5. 学习路径#
- 先掌握基本排序选项
- 学习字段排序和分隔符
- 掌握高级排序和组合使用
- 学习性能优化和大文件处理
- 最后学习自动化工作流
常见问题#
Q: sort 和 uniq 有什么区别?#
A: sort 用于排序,uniq 用于去除重复行。通常先使用 sort 排序,再使用 uniq 去重。
Q: 如何按数字排序?#
A: 使用 sort -n 选项进行数值排序。
Q: 如何按特定字段排序?#
A: 使用 sort -k 选项指定字段,配合 -t 选项指定分隔符。
Q: 如何去除重复行?#
A: 使用 sort -u 选项去除重复行,或者 sort | uniq 组合使用。
Q: 如何处理大文件?#
A: 使用 -T 指定临时目录,-S 指定缓冲区大小,--parallel 指定并行数。
相关命令#
uniq- 去除重复行cut- 提取字段awk- 文本处理join- 连接文件comm- 比较排序文件