0%

sort命令

sort 命令详解:文本排序与数据整理的实用工具

sort 是 Linux 系统中用于对文本内容进行排序的核心命令,它以行为单位对输入数据进行排序,并支持按列、数值、月份等多种方式排序,是处理日志、表格数据、配置文件等的重要工具。本文将详细讲解 sort 命令的选项、用法及实战案例。

sort 基本用法与排序规则

基本语法

1
sort [选项] [文件...]
  • 若不指定文件,sort 从标准输入(管道或键盘)读取数据。
  • 默认排序规则:按字符的 ASCII 码值从小到大排序(字典序)。

基础示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 示例文件:nums.txt
# 3
# 1
# 5
# 2


# 对文件内容排序(默认升序)
sort nums.txt
# 输出:
# 1
# 2
# 3
# 5

# 对管道输入排序(如列出当前目录并排序)
ls | sort

核心选项详解

排序方式控制

-n:按数值大小排序

默认排序按字符 ASCII 码,-n 选项强制按数值大小排序(支持整数和浮点数)。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 示例文件:mixed.txt
# 10
# 2
# 5
# 1

# 默认排序(按字符,10 会排在 2 前面)
sort mixed.txt
# 输出:
# 1
# 10
# 2
# 5

# 按数值排序
sort -n mixed.txt
# 输出:
# 1
# 2
# 5
# 10
-r:反向排序(降序)

-r 选项使排序结果按降序排列(配合 -n 可实现数值降序)。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 数值降序排序
sort -nr mixed.txt
# 输出:
# 10
# 5
# 2
# 1

# 字典降序排序
sort -r words.txt # words.txt 包含:apple banana cat
# 输出:
# cat
# banana
# apple
-k:按指定列排序

-k 选项用于按文本中的 “列” 排序(默认以空格或制表符为分隔符),格式:-k 列号{-k 起始列,结束列}

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 示例文件:users.txt(格式:姓名 年龄 性别)
# Bob 25 male
# Alice 20 female
# Charlie 30 male


# 按第2列(年龄,数值)排序
sort -nk 2 users.txt
# 输出:
# Alice 20 female
# Bob 25 male
# Charlie 30 male

# 按第3列(性别)字典排序,相同性别再按年龄排序
sort -k 3,3 -nk 2 users.txt
# 输出:
# Alice 20 female
# Bob 25 male
# Charlie 30 male
-t:指定列分隔符

默认以空格或制表符分隔列,-t 选项可自定义分隔符(如逗号、冒号)。

示例

1
2
3
4
5
6
7
8
9
10
11
12
# 示例文件:scores.csv(格式:姓名,语文,数学,逗号分隔)
# Bob,80,90
# Alice,95,85
# Charlie,70,95


# 按第2列(语文成绩)数值排序(指定逗号为分隔符)
sort -t ',' -nk 2 scores.csv
# 输出:
# Charlie,70,95
# Bob,80,90
# Alice,95,85

其他实用选项

-u:去重并排序

-u 选项会在排序后去除重复行(仅保留第一行)。

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
# 示例文件:duplicates.txt
# apple
# banana
# apple
# cat


# 去重并排序
sort -u duplicates.txt
# 输出:
# apple
# banana
# cat
-o:将结果写入文件

-o 选项用于将排序结果直接写入指定文件(替代 > 重定向)。

示例

1
2
# 排序后写入 sorted.txt
sort -n numbers.txt -o sorted.txt
-c:检查文件是否已排序

-c 选项用于检查文件是否按指定规则排序,若未排序则输出第一个无序行。

示例

1
2
3
# 检查 numbers.txt 是否按数值升序排序
sort -nc numbers.txt
# 若未排序,输出类似:sort: numbers.txt:3: disorder: 5
-M:按月份排序

-M 选项支持按月份缩写(Jan、Feb…Dec)排序。

示例

1
2
3
4
5
6
7
8
9
10
11
# 示例文件:months.txt
# Mar
# Jan
# Apr


sort -M months.txt
# 输出:
# Jan
# Mar
# Apr

复合排序:多选项组合使用

实际场景中常需组合多个选项实现复杂排序,例如 “先按某列降序,再按另一列升序”。

示例 1:多列排序

1
2
# 对 /etc/passwd 按 UID(第3列)升序,相同 UID 再按 GID(第4列)升序
sort -t ':' -nk 3 -nk 4 /etc/passwd

示例 2:去重 + 数值排序

1
2
3
4
5
6
# 对日志中出现的 IP 按访问次数(第2列)降序,并去重
cat access.log | awk '{print $1}' | sort | uniq -c | sort -nrk 1
# 解析:
# awk '{print $1}' → 提取 IP
# sort | uniq -c → 统计每个 IP 出现次数(格式:次数 IP)
# sort -nrk 1 → 按次数(第1列)降序

示例 3:按列范围排序

1
2
3
4
5
6
7
8
9
10
11
# 按第2列从第2个字符开始的部分排序(如提取年份排序)
# 示例文件:dates.txt(格式:名称 日期(mm/dd/yyyy))
# event1 03/15/2023
# event2 01/20/2024
# event3 12/05/2022

sort -t ' ' -k 2.7,2.10n dates.txt # -k 2.7,2.10 表示第2列的第7-10个字符(年份)
# 输出:
# event3 12/05/2022
# event1 03/15/2023
# event2 01/20/2024

常见误区与注意事项

  1. 数值排序必须加 -n
    若不加 -nsort 会按字符排序(如 100 小于 20,因 1 的 ASCII 码小于 2)。
  2. 列号从 1 开始
    -k 1 表示第 1 列,而非第 0 列,与数组下标不同。
  3. 分隔符的影响
    连续空格会被视为一个分隔符,但自定义分隔符(-t)时需确保一致性(如 CSV 文件中不能有多余逗号)。
  4. 大文件排序
    sort 会自动处理大文件(使用临时文件),但可通过 -S 选项指定内存使用量(如 -S 1G 表示使用 1GB 内存)。

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10