linux sort命令

Linux sort命令用于对文本文件的行进行排序,支持多种排序规则和选项,是数据处理和文本处理中不可或缺的工具。

提示: sort命令默认按照字典序排序,但可以通过选项实现数字排序、月份排序、反向排序等多种排序方式。

语法格式

sort [选项] [文件...]

常用选项

选项 说明
-b 忽略行首空白字符
-d 只考虑字母、数字和空格
-f 忽略大小写
-g 按通用数值排序
-i 只考虑可打印字符
-M 按月份排序(JAN, FEB, ...)
-n 按数值大小排序
-r 反向排序
-u 去重,只输出唯一的行
-k 指定排序的列
-t 指定字段分隔符
-o 将结果输出到指定文件
-m 合并已排序的文件
-c 检查文件是否已排序
-s 稳定排序,保持相等记录的相对顺序

使用示例

示例1:基本排序

# 对文件按字典序排序
sort file.txt

# 对多个文件进行排序
sort file1.txt file2.txt

# 从标准输入读取数据并排序
echo -e "banana\napple\ncherry" | sort

示例2:数值排序

# 创建测试文件
echo -e "10\n2\n25\n100\n5" > numbers.txt

# 按数值大小排序(而不是字典序)
sort -n numbers.txt

# 输出:
# 2
# 5
# 10
# 25
# 100

示例3:反向排序

# 反向排序(Z-A)
sort -r file.txt

# 数值反向排序(从大到小)
sort -nr numbers.txt

# 输出:
# 100
# 25
# 10
# 5
# 2

示例4:去重排序

# 创建有重复数据的文件
echo -e "apple\nbanana\napple\ncherry\nbanana" > fruits.txt

# 排序并去重
sort -u fruits.txt

# 输出:
# apple
# banana
# cherry

示例5:按特定列排序

# 创建以空格分隔的数据文件
echo -e "John 25 50000\nAlice 30 60000\nBob 22 45000" > data.txt

# 按第2列(年龄)数值排序
sort -k2 -n data.txt

# 按第3列(工资)反向数值排序
sort -k3 -nr data.txt

# 使用冒号分隔符,按第3列排序
echo -e "user1:100:500\nuser2:101:300\nuser3:102:400" | sort -t: -k3 -n

示例6:月份排序

# 创建包含月份的文件
echo -e "FEB\nJAN\nMAR\nDEC\nAPR" > months.txt

# 按月份顺序排序
sort -M months.txt

# 输出:
# JAN
# FEB
# MAR
# APR
# DEC

示例7:复杂字段排序

# 按多个字段排序(先按第2列,再按第1列)
echo -e "Bob 25\nAlice 30\nCharlie 25\nDavid 30" | sort -k2,2n -k1,1

# 按特定字符位置排序(第3-5个字符)
echo -e "abc123\nxyz789\ndef456" | sort -k1.3,1.5

示例8:文件操作

# 将排序结果保存到新文件
sort file.txt -o sorted_file.txt

# 检查文件是否已排序
sort -c file.txt

# 如果文件已排序,无输出;如果未排序,显示错误信息

# 合并多个已排序的文件
sort -m sorted1.txt sorted2.txt sorted3.txt

示例9:实际应用场景

# 对日志文件按时间排序
sort -k1,2 access.log

# 统计单词频率并排序
echo "apple banana apple cherry banana apple" | tr ' ' '\n' | sort | uniq -c | sort -nr

# 处理CSV文件
sort -t, -k2,2n data.csv

# 系统进程按内存使用排序
ps aux --sort=-%mem | head -10

# 查找最大的文件
ls -l | sort -k5 -nr | head -10

高级排序技巧

自定义排序顺序

# 使用LC_ALL设置区域设置进行排序
LC_ALL=C sort file.txt  # 按字节值排序
LC_ALL=en_US.UTF-8 sort file.txt  # 按本地化规则排序

处理特殊字符

# 忽略标点符号,只考虑字母数字
sort -d file_with_punctuation.txt

# 忽略不可打印字符
sort -i file_with_special_chars.txt

稳定排序

# 保持相等记录的原始顺序
sort -s -k2,2n data.txt
注意:
  • 默认排序是字典序,数字会被当作字符串处理("10"会排在"2"前面)
  • 使用-n选项进行数值排序时,非数字行会被当作0处理
  • -k选项的格式为-k POS1[,POS2],POS格式为F[.C][OPTS]
  • 使用-t指定分隔符时,如果分隔符是特殊字符,可能需要转义
  • 大文件排序时,sort会使用临时文件,确保/tmp目录有足够空间

sort与其他命令结合

  • sort | uniq -c - 统计频率
  • sort | head/tail - 获取前/后N行
  • sort | tee - 同时输出到屏幕和文件
  • ls -l | sort - 对ls输出排序
  • ps aux --sort - 对进程列表排序
  • find | sort - 对find结果排序

性能优化技巧

  • 对大文件使用-S SIZE指定缓冲区大小
  • 使用--parallel=N启用多线程排序
  • 对于已部分排序的文件,使用-c检查避免重复排序
  • 使用-T DIR指定临时文件目录
  • 合并已排序文件时使用-m而不是重新排序
  • 使用--compress-program压缩临时文件

相关命令

  • uniq - 报告或忽略重复行
  • awk - 文本处理和分析工具
  • cut - 列提取工具
  • join - 基于共同字段连接两个文件
  • comm - 比较两个已排序文件
  • shuf - 随机打乱文件行