首页/系统/Linux 运维命令速查/sort 多键排序(-k/-t)
文本处理77 条

sort 多键排序(-k/-t)

按指定字段排序:-k 起止字段、-t 分隔符、-k 2,2n 字段内数值序,日志与报表整理的进阶用法。

Linux 运维命令速查系统更新于 2026-10-13

按字段排序怎么用

sort 默认按整行做字典序比较,处理结构化文本时需要指定字段与比较方式:-k 选择字段,-t 指定分隔符,字段后缀的修饰符决定比较规则,n 为数值、r 为逆序、f 忽略大小写、V 为版本号。关键细节是 -k2 与 -k2,2 的差别:前者表示从第 2 字段一路比较到行尾,后者只按第 2 字段比较。对含重复键的数据,两者的排序结果会有明显差异,报表类排序应当写完整的区间。

基本信息

适用平台Linux/macOS(GNU coreutils 与 BSD sort)
命令语法sort -t分隔符 -k起始[,结束][修饰符] 文件
常用修饰符n 数值 r 逆序 f 忽略大小写 b 忽略前导空白 V 版本号
字段编号从 1 开始计数,写 0 会报错
相关选项-u 去重 -s 稳定排序 -o 直接写输出文件 --parallel 并行排序

典型使用场景

  • 按 UID 排序账号文件,检查编号分布是否合理
  • 按数值列排序报表,例如耗时或金额
  • 多字段排序:先按类型再按时间排列日志
  • 处理 CSV:用 -t, 指定逗号分隔后再按列排序
  • 结果落盘:用 -o 安全写出,避免重定向截断源文件

常用示例

常用示例
sort -t: -k3,3n /etc/passwd
sort -k2,2 -k1,1r data.txt               # 先第 2 字段升序,再第 1 字段降序
sort -t, -k5,5nr app.log | head          # 第 5 列数值降序
sort -t, -k2,2 -k3,3n data.csv
sort -t: -k3,3n /etc/passwd -o /tmp/passwd.sorted   # -o 避免重定向截断
sort -k2,2 -u data.txt                   # 按第 2 字段去重

字段写法语义

写法含义注意
-k2从第 2 字段比较到行尾等价于按剩余整段比较,日志排序常用
-k2,2只按第 2 字段比较语义清晰,报表排序推荐这样写
-k2,2n第 2 字段按数值比较需确认该列是纯数字或可解析为数字
-k2,2r第 2 字段逆序与 n 组合即 nr,形成数值降序
-t指定分隔符与默认空白分词互斥,多空格文本要先归一化
默认按空白分词,且与 -t 互斥:使用 -t 后连续空格不再被折叠。多空格对齐的文本建议先用 tr -s ' ' 归一化,或改用 awk 提取字段。
要直接写回原文件用 -o 参数,不要写 sort file > file。重定向在命令执行前截断文件,源数据会被清空。

易错点

  • 把 -k2 误当成「只按第 2 字段」,结果后续字段也参与了比较
  • 数值列不加 n 修饰,得到字典序排序,10 会排在 9 前面
  • 用 -t 指定分隔符后仍按多空格理解字段位置,导致列号错位
  • 用重定向写回原文件(sort file > file)把文件清空,应改用 -o

数据来源与参考

  • man 1 sort(GNU coreutils 手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌