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 - 比较排序文件