当前位置: 首页 > news >正文

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输出到文件

十一、结语

感谢您的阅读!如果你有任何疑问或想要分享的经验,请在评论区留言交流!

http://www.dtcms.com/a/289656.html

相关文章:

  • 两个数据表的故事第 2 部分:理解“设计”Dk
  • SElinux和iptables介绍
  • 【Linux操作系统 | 第21篇-进阶篇】Shell编程(下篇)
  • 什么是的优先级反转(Priority Inversion) 和 优先级继承(Priority Inheritance)?
  • 【软件测试】使用ADB命令抓取安卓app日志信息(含指定应用)
  • 【AI论文】递归混合体:学习动态递归深度以实现自适应的令牌级计算
  • faster-lio与fast-lio中如何修改雷达的旋转角度
  • 单片机启动流程和启动文件详解
  • 2025年渗透测试面试题总结-2025年HW(护网面试) 59(题目+回答)
  • 商业秘密保护:从法律理论到企业实战
  • 牛客-删除公共字符
  • 股票账户数据及其数据获取
  • 【时时三省】(C语言基础)字符指针作函数参数
  • 如何系统性备考网络规划师
  • TCL --- 列表_part1
  • 第459场周赛
  • 开源社区贡献指南:如何通过Three.js插件开发提升企业技术影响力?
  • 【JS逆向基础】数据库之mysql
  • Python,GPU编程新范式:CuPy与JAX在大规模科学计算中的对比
  • 【企业架构】TOGAF概念之一
  • Linux基础命令详解:从入门到精通
  • 详解Mysql解决深分页方案
  • 试用SAP BTP 05A:AI服务-Document Information Extraction
  • Python桌面版数独(二版)-增加4X4、6X6
  • 小型支付项目3-5:检测未接收到或未正确处理的支付回调通知
  • 论文笔记:Seed: Bridging Sequence and Diffusion Models for RoadTrajectory Generation
  • LLM指纹底层技术——KV缓存压缩
  • 嵌入式通信DQ单总线协议及UART(一)
  • 是否可以将“进化”应用到软件系统的设计中?
  • 049_List接口(ArrayList / LinkedList / Vector)