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. 字段编号: 字段编号从1开始,不是0
  2. 分隔符: 默认分隔符是空格和制表符
  3. 本地化: 排序结果可能受LC_COLLATE环境变量影响
  4. 稳定性: 默认排序不稳定,需要稳定排序使用-s选项
  5. 内存使用: 大文件排序可能消耗大量内存

相关命令

  • uniq - 去除重复行
  • cut - 提取字段
  • awk - 文本处理
  • join - 连接文件
  • comm - 比较排序文件

sort命令是Linux文本处理的核心工具,掌握其各种选项和技巧对数据处理和系统管理都很重要。

powered by Gitbook© 2025 编外计划 | 最后修改: 2025-07-28 12:42:41

results matching ""

    No results matching ""