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个字符排序(假设字段为AB123CD456):

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. 按文件大小排序(结合lssort

日常运维中,常需查看目录下文件大小并排序,可通过管道组合lssort

# 按文件大小降序排序(-h:人类可读格式,如KB/MB;-l:长格式输出)
ls -lh | sort -hr

4. 忽略前N行排序(跳过表头)

处理CSV、日志文件时,若第一行为表头(字段名),需跳过表头排序,可结合tail命令:

# 跳过score.csv的第一行(表头),按第3字段数值排序
tail -n +2 score.csv | sort -t ',' -k 3n

四、常见错误与避坑指南

  1. 数值排序遗漏-n:将100排在2之前,需牢记“数值排序必加-n”;
  2. 字段分隔符错误:CSV文件未用-t ','指定分隔符,导致-k失效;
  3. 去重不彻底-u仅对完全相同的行去重,需先清理行尾空格(用sed 's/[[:space:]]*$//');
  4. 中文排序乱序:未指定LC_ALL=zh_CN.UTF-8,需确保系统安装了中文locale(可通过locale -a | grep zh_CN检查);
  5. 覆盖原文件错误:直接用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

君九@DBA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值