sort命令

sort 命令 #

sort命令用于对文本文件的行进行排序。它可以按照不同的规则排序,如字母顺序、数字大小、月份名称等,并支持多个排序键。

语法 #

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

常用选项 #

选项 描述
-b, --ignore-leading-blanks 忽略前导空白
-d, --dictionary-order 只考虑字母、数字和空白
-f, --ignore-case 忽略大小写
-g, --general-numeric-sort 按照一般数值排序
-h, --human-numeric-sort 按照人类可读的数字排序(如 2K, 1G)
-i, --ignore-nonprinting 忽略不可打印字符
-k, --key=位置1[,位置2] 按照指定字段排序
-M, --month-sort 按照月份名称排序
-n, --numeric-sort 按照数字值排序
-o, --output=文件 将结果写入指定文件
-r, --reverse 反向排序
-R, --random-sort 随机排序
-s, --stable 稳定排序
-t, --field-separator=分隔符 使用指定的分隔符代替非空白到空白的转换
-u, --unique -c一起使用时,检查严格排序;不与-c一起使用时,只输出第一个相同行
-z, --zero-terminated 以 NUL 字符而不是换行符分隔行
-c, --check, --check=diagnose-first 检查文件是否已排序,不排序
-C, --check=quiet, --check=silent 类似于-c,但不报告第一个无序行

常见用法 #

1. 基本排序 #

sort file.txt

这会按照字母顺序对文件的行进行排序。

2. 按数字排序 #

sort -n file.txt

3. 反向排序 #

sort -r file.txt

4. 忽略大小写排序 #

sort -f file.txt

5. 按特定字段排序 #

sort -k 2 file.txt

这会按照每行的第 2 个字段进行排序。

6. 按多个字段排序 #

sort -k 1,1 -k 2,2n file.txt

这会先按第 1 个字段字母顺序排序,然后按第 2 个字段数字大小排序。

7. 使用自定义分隔符 #

sort -t: -k 3,3n /etc/passwd

这会使用冒号作为分隔符,按第 3 个字段的数字排序。

8. 按月份排序 #

sort -M file_with_months.txt

9. 按人类可读的数字排序 #

sort -h file_with_sizes.txt

这会正确排序如"1K"、“2M”、“3G"这样的大小表示。

10. 去除重复行 #

sort -u file.txt

11. 将排序结果写入文件 #

sort file.txt -o sorted_file.txt

12. 随机排序(打乱顺序) #

sort -R file.txt

13. 检查文件是否已排序 #

sort -c file.txt

如果文件已排序,不会有输出;否则会显示第一个无序行。

14. 稳定排序 #

sort -s -k 2,2 file.txt

这会保持相同键值的行的相对顺序。

字段和位置说明 #

在使用-k选项时,可以指定字段和字段中的位置:

-k 开始字段[.开始字符],结束字段[.结束字符]
  • 字段从 1 开始计数
  • 字符从 1 开始计数
  • 如果省略结束字段,则默认到行尾
  • 如果省略结束字符,则默认到字段尾

例如:

sort -k 2.3,2.5 file.txt

这会按照第 2 个字段的第 3 到第 5 个字符排序。

与其他命令结合使用 #

1. 排序目录内容 #

ls -l | sort -k 5n

这会按文件大小排序。

2. 排序并计数唯一行 #

sort file.txt | uniq -c

3. 排序进程列表 #

ps aux | sort -k 3,3nr

这会按 CPU 使用率降序排序。

4. 排序并查找最大/最小值 #

# 查找最大值
sort -n file.txt | tail -n 1

# 查找最小值
sort -n file.txt | head -n 1

5. 合并多个已排序文件 #

sort -m sorted_file1.txt sorted_file2.txt

实用示例 #

1. 按内存使用量排序进程 #

ps aux | sort -k 4,4nr | head -n 10

2. 查找系统中最大的文件 #

find . -type f -exec ls -s {} \; | sort -n -r | head -10

3. 按最后修改时间排序文件 #

ls -l | sort -k 6M -k 7n -k 8

4. 排序 CSV 文件 #

sort -t, -k 2,2 data.csv

5. 按 IP 地址排序 #

sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n ips.txt

6. 按多个条件排序日志文件 #

sort -k 1,1M -k 2,2n -k 3,3 -k 4,4 logfile.txt

这会按月份、日期、时间排序日志文件。

7. 随机选择行(洗牌) #

sort -R file.txt | head -n 10

这会随机选择 10 行。

提示 #

  • sort命令默认按照字母顺序排序
  • 使用-n选项可以按照数字大小排序
  • 使用-h选项可以按照人类可读的数字排序(如 1K、2M、3G)
  • 使用-k选项可以指定排序的字段
  • 使用-t选项可以指定字段分隔符
  • 使用-r选项可以反向排序
  • 使用-u选项可以去除重复行
  • 使用-s选项可以进行稳定排序,保持相同键值的行的相对顺序
  • 在处理大文件时,sort会自动使用临时文件
  • 可以使用-o选项将排序结果写入原文件:sort -o file.txt file.txt
  • 使用-m选项可以合并多个已排序的文件
  • 在脚本中,通常使用sortuniq命令组合去除重复行并计数