手册页部分 1: 用户命令

退出打印视图

更新时间: 2014 年 7 月
 
 

sort(1)

名称

sort - 对文本文件进行排序、合并或序列检查

用法概要

/usr/bin/sort [-bcdfimMnru] [-k keydef] [-o output] 
     [-S kmem] [-t char] [-T directory]
     [+pos1 [-pos2]] [file]...
/usr/xpg4/bin/sort [-bcdfimMnru] [-k keydef] [-o output] 
     [-S kmem] [-t char] [-T directory] [-y [kmem]] 
     [-z recsz] [+pos1 [-pos2]] [file]...

描述

sort 命令用于对所有已命名文件的行整体进行排序,并将结果写入标准输出中。

以一个或多个从每行输入提取的排序键为基础进行比较。缺省情况下,整个输入行中有一个排序键。各行按照当前语言环境的整理序列进行排列。

选项

以下选项用于更改缺省行为:

/usr/bin/sort

–c

检查单个输入文件是否按参数指定的顺序和当前语言环境的整理序列进行排列。将设置退出代码,除非文件未排序,否则不生成任何输出。

/usr/xpg4/bin/sort

–c

除在任何情况下都不生成输出外,其余均与 /usr/bin/sort 相同。

–y kmem

(过时)。此选项曾用于指定 sort 最初所使用的主内存量。其功能不适用于虚拟内存系统;现在,使用 –S 选项指定 sort 的内存使用情况。

–z recsz

(过时)。此选项曾用于防止在遇到比依赖于系统的缺省缓冲区大小更长的行时出现异常终止。因为 sort 会自动分配足够容纳最长行的缓冲区,此选项已不起作用。

/usr/bin/sort 和 /usr/xpg4/bin/sort

–m

仅限于合并。假定已对输入文件完成排序。

–o output

指定要使用的输出文件的名称,而不是标准输出。该文件可以和其中一个输入文件相同。

–S kmem

指定排序时所使用的基于交换的内存的最大数量,以千字节为单位(缺省单位)。还可直接指定 kmem 来代表多个字节 (b)、千字节 (k)、兆字节 (m)、千兆字节 (g) 或兆兆字节 (t);或代表已安装物理内存的百分比。

–T directory

指定用来放置临时文件的 directory

–u

唯一:对于包含相等键的每组行,只允许出现一次,其余均加以隐藏。如果与 –c 选项结合使用,则除检查输入文件是否已排序外,还会检查并确认不存在任何包含相同键的行。

排序选项

缺省的排序顺序取决于 LC_COLLATE 的值。如果 LC_COLLATE 设置为 C,排序则采用 ASCII 顺序。如果 LC_COLLATE 设置为 en_US,则除非两个字符串相等,而且其中一个字符串比另一个提前出现大写字母,否则排序不区分大小写。其他语言环境具有其他排序顺序。

以下选项会覆盖缺省的排序规则。当排序选项独立于所有键字段规范出现时,请求的字段排序规则会全局应用于所有的排序键。附加到某个特定键时(请参见“排序键选项”部分),指定的排序选项会覆盖该键的所有全局排序选项。在过时的形式中,如果一个或多个上述选项跟在 +pos1 之后,则它只影响由前面选项指定的键字段。

–d

字典顺序:只有字母、数字和空白字符(空格和制表符)对比较有重要的影响。

–f

将小写字母转换为大字母。

–i

忽略不可输出的字符。

–M

以月份进行比较。字段中前三个非空字符将转换为大写形式并进行比较。例如,英文形式的排序顺序为 "JAN" < "FEB" < . . .< "DEC"。比较结果均低于 "JAN" 的字段视为无效字段。–M 选项隐含 –b 选项(请参见下文)。

–n

将排序键限制为初始的数字字符串,其中包含可选的空白字符、可选的负号、零个或多个带可选基数字符和千位分隔符的数字(根据当前语言环境定义),该字符串按算术值进行排序。空数字字符串将视为零。前导零和零上的符号不会影响排序。

–r

逆向读取比较。

字段分隔符选项

可使用以下选项更改字段分隔符的处理方式:

–b

在确定受限排序键的起始位置和结尾位置时忽略前导空白字符。如果在第一个排序键选项的前面指定了 –b 选项,该选项将应用于所有的排序键选项。否则,–b 选项可以独立附加到每个 –k field_startfield_end、+pos1 或 −pos2 选项参数(请参见下文)。

–t char

使用 char 作为字段分隔符字符。char 不属于字段的一部分(虽然可将其包含在排序键中)。每次出现的 char 都很重要(例如 <char><char> 用于分隔空白字段)。如果未指定 –t,则使用空白字符作为缺省的字段分隔符;非空白字符后跟随的每个最大非空空白字符序列都是一个字段分隔符。

排序键选项

可使用以下选项来指定排序键:

–k keydef

keydef 参数是受限排序键字段的定义。该定义的格式为:

–k field_start [type] [,field_end [type] ]

其中:

field_startfield_end

定义受限于行的一部分的键字段。

type

bdfiMnr 字符列表中的一个修饰符。b 修饰符的行为方式与 –b 选项相同,但仅应用于其所附加到的 field_startfield_end,而且字段中的字符将从字段中的第一个非空白字符开始计数。(这分别应用于 first_characterlast_character。)其他修饰符的行为方式与对应选项相同,但仅应用于其所附加到的键字段。修饰符会在指定了 field_start 和/或 field_end 的情况下起到上述作用。如何将任何修饰符附加到 field_startfield_end,则任何选项都不会应用于这两个字符。

存在多个键字段时,只有前面的所有键的比较结果相等之后才会对后面的键进行比较。除非指定了 –u 选项,否则比较结果为相等的行将按照不存在 –d–f–i– n–k 选项的方式进行排序(但已指定的 –r 仍有效),并将所有对比较有重要作用的字节包含在行中。

表示法:

–k field_start[type][,field_end[type]]

定义以 field_start 为开头、以 field_end 为结尾(包含这两个字符)的键字段,除非 field_start 位于行结尾之外,或位于 field_end 之后,在这两种情况下,键字段为空。缺少的 field_end 表示行的最后一个字符。

字段由一个最大非分隔字符序列和前面的字段分隔符(如果缺少 –t 选项)组成。

keydef 选项参数的 field_start 部分采用以下格式:

field_number[.first_character]

字段和字段中的字符均从 1 开始编号。field_numberfirst_character(解释为十进制正整数)指定要用作排序键一部分的第一个字符。如果省略了 .first_character ,则该值表示字段的第一个字符。

keydef 选项参数的 field_end 部分采用以下格式:

field_number[.last_character]

如上所述,field_number 适用于 field_startlast_character(解释为非负十进制整数)指定要用作排序键一部分的最后一个字符。如果 last_character 的求值结果为零,或省略了 .last_character,则该值表示字段中通过 field_number 指定的最后一个字符。

如果 –b 选项或 b 类型修饰符有效,则字段中的字符将从字段中的第一个非空白字符开始计数。(这分别应用于 first_characterlast_character。)

[+pos1 [-pos2]]

(过时)。提供与 –kkeydef 选项等效的功能。

pos1pos2 均采用 m.n 格式,其后可有选择地跟随一个或多个 bdfiMnr 标志。+ m.n 所指定的起始位置被解释为第 m+1 个字段中的第 n+1 个字符。缺少的 .n 代表 .0,表示第 m+1 个字段的第一个字符。如果 b 标志有效,n 将从第 m+1 个字段中的第一个非空白字符开始计数;+m.0b 表示第 m+1 个字段中的第一个非空白字符。

m.n 所指定的最后位置被解释为自第 m 个字段的最后一个字符之后的第 n 个字符(包括分隔符)。缺少的 .n 代表 .0,表示第 m 个字段的最后一个字符。如果 b 标志有效,n 将从第 m+1 个字段的最后一个前导空白字符开始计数;m.1b 表示 m+1 个字段中的第一个非空白字符。

使用类型修饰符 TU 完全指定的 +pos1 −pos2 格式为:

+w.xT -y.zU

等效于:


undefined (z==0 & U contains b & -t is present)
-k w+1.x+1T,y.0U     (z==0 otherwise)
-k w+1.x+1T,y+1.zU   (z > 0) 

实现支持排序键(–k 选项和已过时的 +pos1pos2)至少出现 9 次,这对于命令行排序很重要。如果未指定任何排序键,则使用整个行的缺省排序键。

操作数

支持下列操作数:

file

要进行排序、合并或检查的文件的路径名称。如果未指定 file 操作数,或者如果 file 操作数为 ,则会使用标准输入。

用法

有关 sort 遇到大于或等于 2 GB(231 字节)文件时行为的说明,请参见 largefile(5)

示例

在以下示例中,先后给出了指定 sort 键的首选方法和过时方法,以帮助理解这两种形式之间关系。

示例 1 以第二个字段作为排序键进行排序

以下两个命令都可以第二个字段作为排序键,对 infile 的内容进行排序:

example% sort -k 2,2 infile
example% sort +1 −2 infile 
示例 2 按相反顺序排序

以下两个命令都可以通过将输出放置在 outfile 中,并使用第二个字段的第二个字符作为排序键,按照相反的顺序对 infile1infile2 的内容进行排序(假定第二个字段的第一个字符为字段分隔符):

example% sort -r -o outfile -k 2.2,2.2 infile1 infile2 
example% sort -r -o outfile +1.1 −1.2 infile1 infile2
示例 3 使用其中一个文件中的指定字符进行排序

以下两个命令都可以使用第二个字段的第二个非空白字符作为排序键,对 infile1infile2 的内容进行排序:

example% sort -k 2.2b,2.2b infile1 infile2 
example% sort +1.1b −1.2b infile1 infile2
示例 4 按照数字用户 ID 进行排序

以下两个命令都可以输出按照数字用户 ID(第三个以冒号分隔的字段)进行排序的 passwd(4) 文件(用户数据库):

example% sort -t : -k 3,3n /etc/passwd 
example% sort -t : +2 −3n /etc/passwd
示例 5 输出已排序的行(与某个字段完全相同的行除外)

以下两个命令都可以输出已经过排序的文件 infile 中的行,对于第三个字段相同的行,将允许出现一次,其余均加以隐藏:

example% sort -um -k 3.1,3.0 infile 
example% sort -um +2.0 −3.0 infile 
示例 6 按主机 IP 地址进行排序

以下两个命令都可以输出按照数字 IP 地址(前四个数字字段)进行排序的 hosts(4) 文件(IPv4 主机数据库):

example$ sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n /etc/hosts
example$ sort -t . +0 -1n +1 -2n +2 -3n +3 -4n /etc/hosts

因为 '.' 同时属于字段分隔符和小数分隔符(在许多语言环境下),如果未能指定字段两端的字符,则会导致第二个字段被解释为第一个字段的小数部分,以此类推。

环境变量

有关影响 sort 执行的以下环境变量的描述,请参见 environ(5):LANG、LC_ALL、LC_COLLATE、LC_MESSAGES 和 NLSPATH。

LC_CTYPE

确定将文本数据的字节序列解释为字符(例如参数和输入文件中的单字节及多字节字符)以及对 –b–d–f– i–n 选项采取字符分类行为的语言环境。

LC_NUMERIC

确定为 –n 选项定义基数字符和千位分隔符的语言环境。

退出状态

将返回以下退出值:

0

所有输入文件均已成功输出,或者已指定 –c 并对输入文件进行了正确的排序。

1

如果是在 –c 选项下,则表示文件未按指定顺序排序;如果同时指定了 –c–u 选项,则表示两个输入行中包含相等的键。

>1

出现错误。

文件

/var/tmp/stm???

临时文件

属性

有关下列属性的说明,请参见 attributes(5)

/usr/bin/sort

属性类型
属性值
可用性
system/core-os
CSI
Enabled(已启用)

/usr/xpg4/bin/sort

属性类型
属性值
可用性
system/xopen/xcu4
CSI
Enabled(已启用)
接口稳定性
Committed(已确定)
标准
请参见 standards(5)

另请参见

comm(1)join(1)uniq(1)nl_langinfo(3C)strftime(3C)hosts(4)passwd(4)attributes(5)environ(5)largefile(5)standards(5)

诊断

针对各种故障情况(例如输入行过长)以及在使用 –c 选项时发现的顺序混乱问题,提供注释并以非零状态退出。

附注

当输入文件的最后一行缺少换行字符时,sort 会附加一个,并输出一条警告消息,然后继续。

sort 不能保证对相等的键保留相对的行排序。

用户可以使用 –S 选项对特定方案的 sort 效果进行调整。但是,用户应特别注意的是,与虚拟内存系统相比,sort 更加了解如何使用有限数量的内存进行排序。因此,如果通过 –S 选项调用排序以请求极大量的内存,其效果可能极差。

如上所述,可以使用某些字段修饰符(如 –M–d)对输入数据作出与特定于语言环境的设置有关的解释。如果用户的期望与语言环境所确立的约定不一致,则此解释的结果可能会出乎意料。如果是表示月份的键,sort 不会尝试补偿大致的月份缩写。只有 nl_langinfo(3C)strftime(3C) 中的确切月份缩写是经过认可的。对于可输出顺序或字典顺序,如果语言环境未明确定义这些概念,结果可能是一个空排序键,从而导致下一个键对确定适当排序起重要作用。