Shell脚本-sort工具
一、前言
在 Linux/Unix 系统中,sort
是一个非常实用的文本排序命令,它可以帮助我们对文件或标准输入的数据进行 按行排序,支持多种排序方式,包括按字符串排序、按数值排序、指定字段排序等。
无论是查看日志、统计访问次数,还是编写自动化脚本,sort
都是一个不可或缺的工具。
本文将带你全面了解 sort
工具的使用方式,包括:
✅ sort
的基本语法与常用参数
✅ 如何按字段、数值、字符等进行排序
✅ sort
在 Shell 脚本中的实战应用
✅ 与其他文本处理命令的联合使用
✅ 实际开发中的常见问题与优化建议
并通过完整的代码示例帮助你快速上手并熟练掌握 sort
的各种高级用法。
二、什么是 sort?
sort
是一个用于 对文本数据进行排序 的命令行工具。
它可以:
- 对文件按行排序
- 支持升序或降序排列
- 按照指定字段排序
- 忽略大小写、按数值排序等
✅ 典型用途包括:
场景 | 示例 |
---|---|
日志分析 | 对访问日志按时间排序 |
数据统计 | 对 IP 出现频率排序 |
配置管理 | 对配置项按关键字排序 |
自动化脚本 | 排序后去重输出唯一值 |
三、sort 基础语法
sort [选项] 文件名
✅ 常用选项说明:
参数 | 描述 |
---|---|
-n | 按数值排序 |
-r | 逆序(降序)排序 |
-k | 指定排序字段(如 -k2 表示按第2个字段排序) |
-t | 指定字段分隔符(默认为空格或制表符) |
-u | 输出唯一行(去重) |
-b | 忽略前导空格 |
-f | 忽略大小写 |
-o | 将结果输出到文件 |
四、sort 使用示例
✅ 示例1:基本排序
sort names.txt
默认按字母顺序升序排序。
✅ 示例2:按数值排序(-n
)
cat scores.txt
# 内容:
# 90
# 85
# 100
# 78sort -n scores.txt
输出:
78
85
90
100
✅ 示例3:逆序排序(-r
)
sort -nr scores.txt
输出:
100
90
85
78
✅ 示例4:按字段排序(-k
+ -t
)
假设有一个 CSV 文件 data.csv
:
Alice,28,Beijing
Bob,32,Shanghai
Charlie,25,Guangzhou
按年龄排序:
sort -t',' -k2 data.csv
输出:
Charlie,25,Guangzhou
Alice,28,Beijing
Bob,32,Shanghai
✅ 示例5:去重排序(-u
)
cat logs.txt
# 内容:
# error
# warning
# error
# infosort -u logs.txt
输出:
error
info
warning
五、sort 在 Shell 脚本中的应用
✅ 示例1:统计访问最多的 IP 并排序
grep 'GET /index.html' access.log | cut -d' ' -f1 | sort | uniq -c | sort -nr
输出类似:
123 192.168.1.100
98 192.168.1.101
...
✅ 示例2:提取用户名并排序输出
cut -d':' -f1 /etc/passwd | sort
输出所有用户并按字母排序。
✅ 示例3:按日期排序日志文件
sort -k1,1 -k2,2n access.log
先按第一列(日期)排序,再按第二列(时间)排序。
六、sort 与其他命令的配合使用
✅ 示例1:统计访问次数最多的 URL(sort
+ cut
+ uniq
)
cut -d'"' -f2 access.log | cut -d' ' -f2 | sort | uniq -c | sort -nr | head -n 10
输出访问最多的前 10 个 URL。
✅ 示例2:按内存占用排序进程信息(ps
+ sort
)
ps aux --sort=-%mem | head -n 10
输出内存占用最高的前 10 个进程。
✅ 示例3:合并两个文件并去重排序(cat
+ sort
+ uniq
)
cat file1.txt file2.txt | sort -u
输出两个文件合并后的唯一内容。
七、sort 使用技巧总结
技巧 | 说明 |
---|---|
✅ 使用 -n 按数值排序 | 避免字符串比较干扰 |
✅ 使用 -r 逆序输出 | 快速获取最大/最新记录 |
✅ 使用 -k 多字段排序 | 实现复杂排序逻辑 |
✅ 使用 -t 自定义分隔符 | 适用于 CSV、TSV 等格式 |
✅ 使用 -u 去重排序 | 快速获取唯一值 |
✅ 使用 -f 忽略大小写 | 更灵活匹配关键词 |
✅ 结合 uniq 统计频率 | 实现排名功能 |
✅ 使用 -o 输出到文件 | 避免覆盖原文件 |
八、sort 实战案例汇总
✅ 案例1:从 /etc/passwd
提取用户名并排序
cut -d':' -f1 /etc/passwd | sort
✅ 案例2:按 HTTP 状态码排序日志
cut -d'"' -f3 access.log | cut -d' ' -f2 | sort -n
✅ 案例3:统计访问最多的 IP(带排序)
cut -d' ' -f1 access.log | sort | uniq -c | sort -nr | head -n 10
九、常见问题与解决方法
问题 | 原因 | 解决方案 |
---|---|---|
排序不准确 | 字段分隔符错误 | 检查 -t 是否匹配实际分隔符 |
数字排序异常 | 未使用 -n | 添加 -n 强制按数值排序 |
输出乱序 | 输入未预处理 | 使用 tr 或 awk 格式化后再排序 |
去重无效 | 未使用 -u | 添加 -u 去除重复行 |
中文排序乱码 | 编码不一致 | 设置 LANG=C 或使用 iconv 转换编码 |
十、总结对比表:sort 常用参数一览
参数 | 功能 |
---|---|
-n | 按数值排序 |
-r | 逆序排序 |
-k | 指定字段排序 |
-t | 自定义字段分隔符 |
-u | 去重输出 |
-f | 忽略大小写 |
-b | 忽略前导空格 |
-o | 输出到文件 |
十一、结语
感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!