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
选项可以合并多个已排序的文件 - 在脚本中,通常使用
sort
和uniq
命令组合去除重复行并计数