Linux Shell Sort命令:从基础到进阶的排序神器
本文收录于《 Linux Shell 学习从入门到精通》
Linux Shell Sort命令:从基础到进阶的排序神器
在Linux Shell环境中,排序是数据处理的核心操作之一。无论是整理日志文件、分析CSV数据,还是处理批量文本,sort命令都能凭借其强大的灵活性和高效性成为必备工具。它不仅支持简单的字符排序,还能实现数值排序、按指定字段排序、去重等复杂需求。本文将从基础用法到进阶技巧,全面拆解sort命令的使用场景,帮你轻松驾驭各类排序任务。
一、sort命令基础:核心语法与默认行为
1. 核心语法
sort命令的基本格式如下:
sort [选项] [文件...]
- 若未指定文件,
sort会从标准输入(键盘输入或管道传递的数据)读取内容; - 若指定多个文件,
sort会合并所有文件内容后统一排序。
2. 默认排序规则
不添加任何选项时,sort遵循以下默认行为:
- 按字符ASCII码顺序排序(而非中文拼音或数值大小);
- 逐行比较,从每行第一个字符开始依次对比;
- 排序结果默认输出到标准输出(屏幕),不会修改原文件。
示例1:简单文本排序
假设有文件fruit.txt,内容如下:
banana
apple
cherry
date
Apple
执行默认排序:
sort fruit.txt
输出结果:
Apple
apple
banana
cherry
date
解释:大写字母ASCII码(A-Z:65-90)小于小写字母(a-z:97-122),因此Apple排在apple之前,后续按字母顺序排列。
二、常用核心选项:解决80%的排序需求
sort的强大之处在于丰富的选项,以下是最常用的核心功能,覆盖日常大部分场景。
1. 数值排序(而非字符排序):-n选项
默认字符排序会将数值按“字符顺序”处理(例如10会排在2之前,因为1的ASCII码小于2)。-n(--numeric-sort)选项可强制按数值大小排序。
示例2:数值排序vs字符排序
创建文件numbers.txt:
10
2
25
3
100
- 字符排序(默认):
sort numbers.txt # 输出:10 100 2 25 3(按首字符ASCII码排序) - 数值排序(
-n):sort -n numbers.txt # 输出:2 3 10 25 100(按数值升序)
2. 逆序排序:-r选项
-r(--reverse)选项用于反转排序结果,实现降序排列,可与-n、字符排序等结合使用。
示例3:数值降序排序
sort -nr numbers.txt
# 输出:100 25 10 3 2
3. 去重排序:-u选项
-u(--unique)选项会在排序后去除重复行(仅保留第一次出现的行),等价于sort | uniq,但效率更高。
示例4:去重排序
创建文件duplicates.txt:
cat
dog
cat
bird
dog
执行去重排序:
sort -u duplicates.txt
# 输出:bird cat dog(排序后无重复)
⚠️ 注意:-u仅对“完全相同的行”去重,若行尾有空格、制表符等不可见字符,会被视为不同行。
4. 按指定字段排序:-k选项
处理结构化数据(如CSV、日志文件,字段间用分隔符分隔)时,-k(--key=POS1[,POS2])选项可指定按第N个字段排序。
关键补充:字段分隔符-t
默认情况下,sort以“空白字符”(空格、制表符)为分隔符,且多个空白字符视为一个分隔符。若数据用逗号、冒号等分隔,需用-t指定分隔符。
示例5:按CSV文件的指定字段排序
假设有学生成绩文件score.csv(逗号分隔,格式:姓名,语文,数学):
张三,85,92
李四,90,88
王五,78,95
张三,85,90
- 按“数学成绩”(第3字段)数值升序排序:
sort -t ',' -k 3 -n score.csv # 输出: # 张三,85,90 # 李四,90,88 # 张三,85,92 # 王五,78,95 - 按“语文成绩”(第2字段)降序,再按“数学成绩”(第3字段)升序排序:
sort -t ',' -k 2nr -k 3n score.csv # 解释:-k 2nr 表示第2字段数值降序,-k 3n 表示第3字段数值升序 # 输出: # 李四,90,88 # 张三,85,90 # 张三,85,92 # 王五,78,95
字段范围细化:-k POS1,POS2
-k可指定字段内的字符范围,格式为-k 字段号.起始字符,字段号.结束字符(字符从1开始计数)。
示例:按第2字段的第2-3个字符排序(假设字段为AB123、CD456):
sort -t ',' -k 2.2,2.3 score.csv
5. 忽略大小写排序:-f选项
-f(--ignore-case)选项会忽略大小写差异,将大写和小写字母视为相同字符排序。
示例6:忽略大小写排序
sort -f fruit.txt
# 输出:apple Apple banana cherry date(不区分大小写,按字母顺序)
6. 稳定排序:-s选项
当两行的排序字段完全相同时,sort默认会按原文件中的顺序保留(部分版本可能不稳定)。-s(--stable)选项强制启用稳定排序,确保相等元素的相对顺序与原文件一致。
示例7:稳定排序
对score.csv按语文成绩(第2字段)排序后,相同语文成绩的行保留原顺序:
sort -t ',' -k 2n -s score.csv
三、进阶技巧:处理复杂场景
1. 排序后覆盖原文件:-o选项
sort默认输出到屏幕,若需将排序结果写入原文件,不能直接用sort file > file(会先清空文件),需用-o(--output=FILE)选项:
sort -n numbers.txt -o numbers.txt # 安全覆盖原文件
2. 处理多字节字符(中文排序)
默认sort不支持中文拼音排序(按GBK/UTF-8编码的字节顺序排序,结果混乱)。需借助LC_ALL环境变量指定 locale 为中文编码:
# UTF-8编码文件(如中文文件名、内容)
LC_ALL=zh_CN.UTF-8 sort chinese.txt
# GBK编码文件
LC_ALL=zh_CN.GBK sort chinese_gbk.txt
示例8:中文姓名排序
文件chinese_names.txt:
李四
张三
王五
赵六
执行中文排序:
LC_ALL=zh_CN.UTF-8 sort chinese_names.txt
# 输出:李四 王五 张三 赵六(按拼音首字母L、W、Z排序)
3. 按文件大小排序(结合ls和sort)
日常运维中,常需查看目录下文件大小并排序,可通过管道组合ls和sort:
# 按文件大小降序排序(-h:人类可读格式,如KB/MB;-l:长格式输出)
ls -lh | sort -hr
4. 忽略前N行排序(跳过表头)
处理CSV、日志文件时,若第一行为表头(字段名),需跳过表头排序,可结合tail命令:
# 跳过score.csv的第一行(表头),按第3字段数值排序
tail -n +2 score.csv | sort -t ',' -k 3n
四、常见错误与避坑指南
- 数值排序遗漏
-n:将100排在2之前,需牢记“数值排序必加-n”; - 字段分隔符错误:CSV文件未用
-t ','指定分隔符,导致-k失效; - 去重不彻底:
-u仅对完全相同的行去重,需先清理行尾空格(用sed 's/[[:space:]]*$//'); - 中文排序乱序:未指定
LC_ALL=zh_CN.UTF-8,需确保系统安装了中文locale(可通过locale -a | grep zh_CN检查); - 覆盖原文件错误:直接用
sort file > file导致文件清空,必须用-o选项。
五、常用组合命令总结
| 需求场景 | 命令示例 |
|---|---|
| 数值降序+去重 | sort -nrfu numbers.txt |
| CSV按第2字段升序+去重 | sort -t ',' -k 2n -u data.csv |
| 中文文件名排序 | LC_ALL=zh_CN.UTF-8 sort -f chinese_files.txt |
| 日志按时间戳(第4字段)降序 | sort -t ' ' -k 4r log.txt |
| 按文件大小升序排列 | `ls -lh |
六、总结
sort命令是Linux Shell中功能强大的排序工具,从简单的文本排序到复杂的结构化数据处理,都能通过组合选项高效完成。核心要点:
- 基础排序:默认字符排序,
-n数值排序,-r逆序,-u去重; - 字段排序:
-t指定分隔符,-k指定字段,支持多字段组合; - 特殊场景:中文排序需指定
LC_ALL,覆盖原文件用-o,跳过表头用tail -n +2。
若有转载,请标明出处:https://blog.csdn.net/CharlesYuangc/article/details/153530990

1389

被折叠的 条评论
为什么被折叠?



