sort 是 Linux 系统中用于对文本文件行进行排序的命令行工具,能够按字母顺序、数值大小、日期等规则排序,并可指定字段及分隔符,常通过管道与其他命令组合使用,是文本处理和数据分析的重要工具。
一、命令语法与核心概念
基本语法 :
bash
sort [选项] [文件...]
- 选项 :控制排序的行为(如排序顺序、字段分隔符等)
- 文件 :要排序的输入文件,可指定多个;若不指定,sort 会从标准输入(stdin)读取数据
核心概念 :
sort 将输入的每一行视为一个记录,按照指定的规则比较各行,输出排序后的结果。它不会直接修改原文件,而是将排序后的结果输出到标准输出(终端)或通过重定向保存到文件。
二、常用选项详解
| 选项 | 长选项 | 描述 |
|---|---|---|
| -b | --ignore-leading-blanks | 忽略每行开头的空白字符 |
| -d | --dictionary-order | 仅考虑字母、数字和空格,忽略其他字符 |
| -f | --ignore-case | 忽略大小写(将大写和小写视为相同) |
| -g | --general-numeric-sort | 按通用数值比较 |
| -h | --human-numeric-sort | 比较人类可读数字(如 2K、1G) |
| -i | --ignore-nonprinting | 仅考虑可打印字符 |
| -k | --key=POS1[,POS2] | 指定排序的字段位置 |
| -m | --merge | 合并已排序的文件,不再排序 |
| -M | --month-sort | 按月份名称排序(JAN < FEB < ... < DEC) |
| -n | --numeric-sort | 按数值大小排序(而非字符串顺序) |
| -o | --output=FILE | 将结果写入文件(而非标准输出) |
| -r | --reverse | 逆序输出排序结果 |
| -R | --random-sort | 随机排序,但相同键会被分组 |
| -t | --field-separator=SEP | 指定字段分隔符(默认是空白字符) |
| -u | --unique | 去除重复行,仅保留唯一行 |
| -V | --version-sort | 对文本内的版本号进行自然排序 |
| -c | --check | 检查输入是否已排序,若已有序则不进行操作 |
| -C | --check=quiet | 类似 -c,但不报告第一个无序行 |
| --parallel=N | 指定同时运行的排序线程数 | |
| -S | --buffer-size=SIZE | 指定主内存缓存大小 |
| -T | --temporary-directory=DIR | 指定临时文件存放目录 |
三、排序规则
sort 的排序规则受当前**语言环境(**locale ) 影响。在默认环境下:
- 以数字开头的行 优先级最高
- 以小写字母开头的行 优先级次之
- 按字典序比较
若希望按ASCII码严格排序(忽略locale影响),可设置:
bash
LC_ALL=C sort file.txt
这会让大写字母排在前面。
四、实用示例
5.1 基础排序
bash
#按字母顺序排序
sort fruits.txt #输出:apple banana grape orange
#按数值排序(关键:不加-n会将"10"排在"2"前面)
sort -n numbers.txt #输出:2 10 50 100
#逆序排序
sort -r fruits.txt #输出:orange grape banana apple
#忽略大小写排序
sort -f names.txt # 'Alice'和'alice'被视为相同\[reference:33\]
5.2 字段排序(CSV 或分隔符文件)
bash
#按第2列(年龄)数值排序(逗号分隔)
sort -t ',' -k 2n employees.csv
#示例输入:John,25,male →输出:John,25,male Alice,28,female Jane,30,female Bob,35,male
#按第2列数值逆序排序
sort -t ',' -k 2nr employees.csv[reference:34]