sort命令支持多字段分层排序与去重组合:先用-t指定分隔符,-k指定字段范围(如-k2,2 -k3,3nr实现部门升序、同部门工资降序),再用-u全局去重或按列去重;混合字段需注意字典序陷阱。

Linux 运维中,sort 命令是处理日志、配置文件、CSV 数据等文本内容的核心工具。多条件排序和去重不是两个孤立操作,而是常组合使用——先排序再统一去重,或边排序边控制重复逻辑。
按多个字段分层排序(如部门+工资)
实际运维中常需“先按某列分组,组内再按另一列排序”。例如员工数据 employees.csv 格式为:姓名,部门,工资,要求:先按部门升序,同部门内按工资降序。
-
-t ','指定逗号为字段分隔符 -
-k2,2表示只取第2列(部门)整体作为排序依据(避免跨列干扰) -
-k3,3nr表示对第3列(工资)按数值(-n)、逆序(-r)排序 - 命令写法:
sort -t',' -k2,2 -k3,3nr employees.csv
注意:字段范围写成 -k2,2 而非 -k2 更稳妥,后者可能意外延伸到后续列;多个 -k 参数按从左到右顺序生效。
排序后全局去重(非仅相邻行)
sort -u 可直接去重,但它依赖“重复行必须相邻”这一前提。而原始文件通常无序,所以必须先 sort,再 -u,不能跳步。
- 简单去重:
sort file.txt | sort -u或更常用sort -u file.txt(sort -u内部已隐含排序) - 按某列去重(保留该列首次出现的整行):
sort -t' ' -k2,2 -u access.log——以空格分隔,按第2列(如IP)去重,保留每个IP第一次出现的那行 - 去重并统计频次(如统计访问IP次数):
sort access.log | uniq -c | sort -nr,其中uniq -c必须接在sort后面,否则只统计相邻重复
结合数值与字母混合场景的细节处理
运维中常见混合类型字段(如版本号 v1.10、v1.2),默认字典序会把 v1.10 排在 v1.2 前面(因字符 '1' -V(版本排序)替代 -n:
-
sort -V versions.txt正确排序:v1.2→v1.10→v2.0 - 若要降序加
-r:sort -Vr versions.txt - 对带前导空格或大小写混杂的字段,可加
-b(忽略前导空白)和-f(忽略大小写)提升鲁棒性
实用技巧:避免常见陷阱
很多问题不是命令不会用,而是忽略了底层机制:
-
sort默认按字符排序,数字 10 会排在 2 前面(因为 '1' -n 处理纯数字列 -
uniq不排序,只处理相邻重复行;单独用uniq -u对未排序文件几乎无效 - 大文件排序内存不足时,可用
--buffer-size=1G或--temporary-directory=/path控制资源 - 确认排序结果是否符合预期,可用
sort -c file.txt检查文件是否已有序(返回 0 表示已排序)











