约 9966 字

约 50 分钟

#Bash 的 sort 命令

sort [OPTION]... [FILE]...

功能

将文本文件的行进行排序。

类型

可执行文件(/usr/bin/sort),属于 coreutils。

参数

  • OPTION 选项:
    • -b, --ignore-leading-blanks - 忽略开头的空白
    • -d, --dictionary-order - 使用字典序,忽略字母、数字、空格以外的字符(默认)
    • -f, --ignore-case - 忽略大小写,小写字母当作大写字母
    • -g, --general-numeric-sort - 比较广义数值大小('NaN' < '-inf' < '2' < '3.14' < '10' < '1e4' < 'inf')
    • -i, --ignore-nonprinting - 忽略不可打印的字符(参考 isprint)
    • -M, --month-sort - 比较月份大小(其它 < 'JAN' < 'FEB' < ... < 'DEC')
    • -h, --human-numeric-sort - 比较含单位的数值大小(2K < 1G)
    • -n, --numeric-sort - 比较数值大小('2' < '3.14' < '10'),非数值视为 0
    • -R, --random-sort - 随机排序(但是相同的行会在一起)
    • --random-source=FILE - 通过 FILE 获取随机数
    • -r, --reverse - 逆序输出;默认为升序,此选项为降序
    • --sort=WORD - 按 WORD 排序:
      • general-numeric - 同 -g,比较广义数值大小('NaN' < '-inf' < '2' < '3.14' < '10' < '1e4' < 'inf')
      • human-numeric - 同 -h,比较含单位的数值大小(2K < 1G)
      • month - 同 -M,比较月份大小(其它 < 'JAN' < 'FEB' < ... < 'DEC')
      • numeric - 同 -n,比较数值大小('2' < '3.14' < '10'),非数值视为 0
      • random - 同 -R,随机排序(但是相同的行会在一起)
      • version - 同 -V,比较版本号大小('v3.2' < 'v10.1')
    • -V, --version-sort - 比较版本号大小('v3.2' < 'v10.1')
    • --batch-size=NMERGE - 一个合并最多 NMERGE 个输入
    • -c, --check, --check=diagnose-first - 检查输入是否已经排序,而不是进行排序
    • -C, --check=quiet, --check=silent - 检查输入是否已经排序,而不是进行排序,并且不报告错序行
    • --compress-program=PROG - 使用 PROG 命令临时进行压缩,之后使用 PROG -d 命令解压
    • --debug - 打印调试信息;对用于排序的行进行注释并将可疑用法输出到标准错误
    • --files0-from=F - 从文件 F 中读取文件列表作为输入,每个文件名以空字符(\0)结尾;如果 F 是 - 则从标准输入读取文件列表
    • -k, --key=KEYDEF - 根据键进行排序
    • -m, --merge - 合并已经排序的文件,而不是进行排序
    • -o, --output=FILE - 将结果输出到 FILE 文件;默认为标准输出
    • -s, --stable - 稳定排序
    • -S, --buffer-size=SIZE - 使用 SIZE 主内存缓冲
    • -t, --field-separator=SEP - 使用 SEP 作为分隔,而不是非空白到空白的过渡作为分隔
    • -T, --temporary-directory=DIR - 使用 DIR 作为临时目录,而不是 $TMPDIR 或 /tmp
    • --parallel=N - 并发运行数量设为 N
    • -u, --unique - 排序时相同的行只输出一次;检查排序(与 -c 一同使用)时严格检查顺序 (不能有重复行)
    • -z, --zero-terminated - 以空字符(\0)作为行的结尾,而不是换行符(\n)
    • --help - 显示帮助
    • --version - 显示版本
  • FILE - 文件列表;如果没有这个参数或指定为 -,则读取标准输入

#示例

示例文件内容:

apple
Apple
!banana
10
2
50K
3M
Jan
Feb
v1
v2
v10
3.5
1e2
NaN

默认排序(字典序)

$ sort 1.txt
10
1e2
2
3.5
3M
50K
apple
Apple
!banana
Feb
Jan
NaN
v1
v10
v2

按数值排序

$ sort -n 1.txt
apple
Apple
!banana
Feb
Jan
NaN
v1
v10
v2
1e2
2
3M
3.5
10
50K

按广义数值排序

$ sort -g 1.txt
apple
Apple
!banana
Feb
Jan
v1
v10
v2
NaN
2
3M
3.5
10
50K
1e2

含单位的数值排序

$ sort  -h 1.txt
apple
Apple
!banana
Feb
Jan
NaN
v1
v10
v2
1e2
2
3.5
10
50K
3M
$ du -d1 -h ~/Downloads/ | sort -h          # 查看 ~/Downloads/ 中一级子目录的大小,按大小排序
8.0K    ~/Downloads/logs
2.5M    ~/Downloads/byte-unixbench
2.5M    ~/Downloads/demo
24M     ~/Downloads/versions
42M     ~/Downloads/libraries
344M    ~/Downloads/jdk-23.0.2
389M    ~/Downloads/jdk-26.0.1
571M    ~/Downloads/QtTheme
1.4G    ~/Downloads/

版本号排序

$ sort -V 1.txt
1e2
2
3M
3.5
10
50K
Apple
Feb
Jan
NaN
apple
v1
v2
v10
!banana

月份排序

$ sort -M 1.txt
10
1e2
2
3.5
3M
50K
apple
Apple
!banana
NaN
v1
v10
v2
Jan
Feb

合并文件排序

$ cat core-tuils.md util-linux.md | sort
| [addpart](/document/zh/10.Bash/90.帮助手册/EX.addpart.md) | 添加硬盘分区 |
| [agetty](/document/zh/10.Bash/90.帮助手册/EX.agetty.md) | 在终端设备上启动登录提示并等待用户登录 |
| [arch](/document/zh/10.Bash/90.帮助手册/EX.arch.md) | 查看硬件架构 |
| [b2sum](/document/zh/10.Bash/90.帮助手册/EX.b2sum.md) | 计算、校验 BLAKE2 校验和 |
| [base32](/document/zh/10.Bash/90.帮助手册/EX.base32.md) | 进行 BASE32 编码或解码 |
| [base64](/document/zh/10.Bash/90.帮助手册/EX.base64.md) | 进行 BASE64 编码或解码 |
| [basename](/document/zh/10.Bash/90.帮助手册/EX.basename.md) | 提取文件名(去除目录和后缀) |
| [basenc](/document/zh/10.Bash/90.帮助手册/EX.basenc.md) | 对数据进行编码或解码 |
| [blkdiscard](/document/zh/10.Bash/90.帮助手册/EX.blkdiscard.md) | 丢弃磁盘设备的区块 |
| [blkid](/document/zh/10.Bash/90.帮助手册/EX.blkid.md) | 获取块设备的属性 |
| [blkzone](/document/zh/10.Bash/90.帮助手册/EX.blkzone.md) | 管理和查看分区式(zoned)块设备的 zone 信息 |
| [blockdev](/document/zh/10.Bash/90.帮助手册/EX.blockdev.md) | 从命令行对块设备调用 `ioctl` |

#推荐阅读

#手册

更新: 2026/10/4

作者: planc

创建: 2025/12/4