sort 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,聚焦
sort——文本处理命令族(见文本处理命令族)。它和 uniq 是天生一对:先 sort 再 uniq 才能正确去重/计数。
sort 把文本行按规则排序。它最经典的搭档是 uniq——因为 uniq 只处理相邻重复行,所以"去重/计数"前必须先 sort。这一组合在日志统计里无处不在。
一、基本排序
sort file # 按字典序(默认)
sort -r file # 反向(降序)
sort -n file # 按数值大小(不是字典!)
sort -u file # 排序并去重(等同 sort | uniq)
sort -f file # 忽略大小写字典序 vs 数值序是最大的坑:
sort默认按字符逐个比,"10" 会排在 "2" 前面(因为 '1' < '2')。要按数字大小排必须-n,否则统计/榜单全错。-u是"排序+去重"一步到位,等价于sort | uniq。
二、按字段排序:-k 与 -t
sort -t: -k3 -n /etc/passwd # 以冒号分隔,按第 3 列(UID)数值排序
sort -k2 file # 按第 2 列(默认字典序)
sort -t, -k2 -n data.csv # 逗号分隔,第 2 列数值排序
sort -k1,1 -k2,2n file # 先按第 1 列、再按第 2 列数值(多字段)
-t指定分隔符、-k指定按第几列排。-k3 -n表示"第 3 列按数值"。多字段排序用多个-k,如-k1,1 -k2,2n:先比第 1 列(字典),相同再比第 2 列(数值)。k后面跟n/r等修饰符决定该列的比较方式。
三、稳定排序与输出
sort -s file # 稳定排序(相等行保持原顺序)
sort -o out.txt file # 结果写到文件(可覆盖自身)
sort -c file # 检查文件是否已排序(没排好返回非0)默认 sort 不稳定(相等元素的相对顺序不保证),加
-s变稳定,某些场景(保持原有分组)需要。-o能输出回原文件(避免sort f > f把文件清空的经典错误)。-c用于校验"这文件是不是已经排好序了",脚本里判断用。
四、实战:统计前必须先 sort
# 统计每个 IP 访问次数并取 Top 10(标准套路)
cut -d' ' -f1 access.log | sort | uniq -c | sort -rn | head
# ↑sort ↑uniq ↑再按次数数值降序这条流水线 each 环节职责清晰:取列 → sort(让相同 IP 相邻)→ uniq -c(计数)→ sort -rn(按次数降序)→ head(取前 10)。少了第一个 sort,uniq -c 就只能数到相邻的重复,结果错得离谱。完整思路见 grep 实战 与 uniq。
五、sort vs awk 的排序
| 场景 | 用 |
|---|---|
| 整行/按列排序、配合 uniq 计数 | sort(管道友好) |
| 排序同时做计算/重组 | awk 的 asort/sort_by(见 awk) |
纯排序 + 管道接 uniq,
sort是标准;若要"排序完顺手求和/重组",awk 内建排序更顺。日常 90% 的"排个序再数一数"都是sort | uniq -c | sort -rn这一式。
一句话总结
sort = 文本排序,uniq 的前置:默认字典序、-n 才是数值序(10 不会排在 2 前)、-r 反向、-t/-k 按分隔符指定列排序、-u 排序去重;多字段 -k1,1 -k2,2n。"去重计数"必须 sort | uniq -c 因为 uniq 只管相邻行。日志统计 cut|sort|uniq -c|sort -rn|head 是标配流水线。