sort
sort
命令用于对文本文件的行进行排序,是Linux文本处理中的重要工具,支持多种排序方式和选项。
基本语法
sort [选项] [文件...]
主要选项
排序方式
-r, --reverse
- 反向排序(降序)-n, --numeric-sort
- 按数值排序-h, --human-numeric-sort
- 按人类可读数值排序(如1K, 2M)-g, --general-numeric-sort
- 按通用数值排序(支持科学计数法)-V, --version-sort
- 按版本号排序-M, --month-sort
- 按月份名称排序-R, --random-sort
- 随机排序
排序键
-k, --key=KEYDEF
- 指定排序键-t, --field-separator=SEP
- 指定字段分隔符
输出控制
-u, --unique
- 输出唯一行(去重)-o, --output=FILE
- 输出到指定文件-m, --merge
- 合并已排序的文件-c, --check
- 检查是否已排序-C, --check=quiet
- 静默检查排序
比较选项
-f, --ignore-case
- 忽略大小写-d, --dictionary-order
- 字典序(只考虑字母、数字、空格)-i, --ignore-nonprinting
- 忽略不可打印字符-b, --ignore-leading-blanks
- 忽略前导空格
其他选项
-s, --stable
- 稳定排序-T, --temporary-directory=DIR
- 指定临时目录-S, --buffer-size=SIZE
- 指定缓冲区大小--parallel=N
- 并行排序(使用N个线程)
使用示例
基本排序
# 按字母顺序排序
sort file.txt
# 反向排序
sort -r file.txt
# 忽略大小写排序
sort -f file.txt
# 去重排序
sort -u file.txt
数值排序
# 按数值排序
echo -e "10\n2\n100\n1" | sort -n
# 输出: 1, 2, 10, 100
# 反向数值排序
sort -nr numbers.txt
# 人类可读数值排序
echo -e "1K\n2M\n500\n1G" | sort -h
# 输出: 500, 1K, 2M, 1G
# 版本号排序
echo -e "v1.10\nv1.2\nv2.1\nv1.1" | sort -V
字段排序
# 按第二个字段排序(默认空格分隔)
sort -k 2 file.txt
# 按第二个字段数值排序
sort -k 2n file.txt
# 指定分隔符并按字段排序
sort -t ',' -k 2 data.csv
# 多字段排序(先按第2字段,再按第3字段)
sort -k 2,2 -k 3,3 file.txt
复杂排序键
# 按第2字段的第3个字符开始排序
sort -k 2.3 file.txt
# 按第2字段到第4字段排序
sort -k 2,4 file.txt
# 按第2字段数值排序,然后第1字段字符排序
sort -k 2n -k 1 file.txt
# 反向排序特定字段
sort -k 2nr file.txt
实际应用场景
系统管理
# 按内存使用排序进程
ps aux | sort -k 4nr | head -10
# 按文件大小排序
ls -l | sort -k 5nr
# 排序/etc/passwd文件
sort -t ':' -k 3n /etc/passwd
# 按CPU使用率排序
top -bn1 | tail -n +8 | sort -k 9nr
日志分析
# 按时间排序日志
sort -k 1M -k 2n -k 3 access.log
# 统计访问最多的IP
cut -d ' ' -f 1 access.log | sort | uniq -c | sort -nr
# 按日期排序日志文件
ls /var/log/*.log | sort -V
# 分析错误日志出现频率
grep ERROR application.log | sort | uniq -c | sort -nr
数据处理
# 排序CSV文件的特定列
sort -t ',' -k 3nr sales.csv
# 合并多个已排序的文件
sort -m file1.txt file2.txt file3.txt
# 检查文件是否已排序
sort -c data.txt && echo "已排序" || echo "未排序"
# 按多个条件排序
sort -t ',' -k 2M -k 3nr -k 1 data.csv
网络分析
# 分析网络连接
netstat -tuln | sort -k 4
# 排序路由表
route -n | sort -k 1
# 分析网络统计
ss -s | sort
# 按端口排序网络连接
netstat -an | grep LISTEN | sort -k 4
高级技巧
自定义排序
# 按文件扩展名排序
ls | sort -t '.' -k 2
# 按IP地址排序
sort -t '.' -k 1,1n -k 2,2n -k 3,3n -k 4,4n ip_list.txt
# 按时间戳排序(Unix时间戳)
sort -k 1n timestamp_data.txt
# 按URL路径排序
sort -t '/' -k 3 url_list.txt
性能优化
# 大文件排序使用临时目录
sort -T /tmp/sort_temp big_file.txt
# 增加缓冲区大小
sort -S 1G large_file.txt
# 并行排序
sort --parallel=4 huge_file.txt
# 压缩临时文件
sort --compress-program=gzip big_file.txt
组合使用
# 排序后输出到文件
sort input.txt -o output.txt
# 多文件合并排序
sort file1.txt file2.txt file3.txt > merged.txt
# 排序并去重
sort -u file.txt
# 检查排序状态
if sort -c file.txt 2>/dev/null; then
echo "文件已排序"
else
echo "文件需要排序"
fi
排序键语法详解
键定义格式
# 格式: -k F[.C][OPTS][,F[.C][OPTS]]
# F = 字段号
# C = 字符位置
# OPTS = n(数值), r(反向), f(忽略大小写)
# 示例
sort -k 2n # 按第2字段数值排序
sort -k 2.3 # 从第2字段第3个字符开始
sort -k 2,2n # 只按第2字段数值排序
sort -k 2nr # 第2字段数值反向排序
复杂排序示例
# 按用户ID数值排序,然后按用户名字符排序
sort -t ':' -k 3,3n -k 1,1 /etc/passwd
# 按日期时间排序日志(假设格式为 YYYY-MM-DD HH:MM:SS)
sort -k 1,1 -k 2,2 access.log
# 按文件大小排序,相同大小按名称排序
ls -l | tail -n +2 | sort -k 5,5nr -k 9,9
特殊用法
随机排序
# 随机排序文件行
sort -R file.txt
# 随机选择一行
sort -R file.txt | head -1
# 随机排序并选择前N行
sort -R file.txt | head -5
月份排序
# 按月份名称排序
echo -e "Dec\nJan\nMar\nFeb" | sort -M
# 在日志分析中按月份排序
grep "2023" logs.txt | sort -k 2M
稳定排序
# 保持相同元素的相对顺序
sort -s -k 2 file.txt
# 多级稳定排序
sort -s -k 1 | sort -s -k 2
常见错误和解决方案
数值排序问题
# 错误:将数字当作字符排序
sort numbers.txt # 输出: 1, 10, 2
sort -n numbers.txt # 正确: 1, 2, 10
# 科学计数法排序
sort -g scientific.txt # 1e2, 2e1, 3e0
字段分隔符问题
# 多个空格作为分隔符时
sort -k 2 file.txt # 可能错误
tr -s ' ' < file.txt | sort -k 2 # 压缩空格后排序
内存不足问题
# 大文件排序内存不足
sort -T /tmp big_file.txt # 使用临时目录
sort -S 500M big_file.txt # 限制内存使用
注意事项
- 字段编号: 字段编号从1开始,不是0
- 分隔符: 默认分隔符是空格和制表符
- 本地化: 排序结果可能受LC_COLLATE环境变量影响
- 稳定性: 默认排序不稳定,需要稳定排序使用-s选项
- 内存使用: 大文件排序可能消耗大量内存
相关命令
uniq
- 去除重复行cut
- 提取字段awk
- 文本处理join
- 连接文件comm
- 比较排序文件
sort命令是Linux文本处理的核心工具,掌握其各种选项和技巧对数据处理和系统管理都很重要。