sort 命令

用途

排序文件、对已排序的文件进行合并,并检查文件以确定它们是否已排序。

语法

排序 [ -A ] [-b ] [-c ] [ -d ] [ -f ] [ -i ] [ -m ] [ -n ] [ -r ] [ -u ] [ -o OutFile ] [ -t Character ] [ -T Directory ] [ -y [ 千字节 ]] [ -z RecordSize ] [[ + [ FSkip ] [ CSkip ] [ b ] [ d ] [ f ] [ i ] [ n ] [ r ]] [ - [ FSkip ] [ .CSkip ] [ b ] [ d ] [ f ] [ i ] [ n ] [ r ]]] ... [ -k KeyDefinition ] ... [ 文件 ... ]

描述

sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出。 如果 File 参数指定多个文件,那么 sort 命令将这些文件连接起来,并当作一个文件进行排序。 -(减号)代替文件名指定标准输入。 如果未指定任何文件名,那么该命令对标准输入排序。 可以使用 -o 标志指定输出文件。

如果未指定任何标志,sort 命令基于当前语言环境的整理顺序对输入文件的所有行排序。

排序键

排序关键字是输入行的一部分,由字段号和列号指定。 字段是输入行的组成部分,由字段分隔符分隔。 缺省字段分隔符是由一个或多个连续空格字符组成的序列。 然而,这些空白字符被看作以下用于排序的字段的一部分。 您可以指定 -b 选项来忽略这些开头的空白字符。 使用 -t 标志可指定不同的字段分隔符。 在 C 语言和英语语言环境下,制表符和空格字符都是空格符。

使用排序关键字时,sort 命令首先根据第一个排序关键字的内容对所有行排序。 然后,根据第二个排序关键字的内容,对所有第一个排序关键字相同的行排序,如此进行下去。 按照排序关键字在命令行中出现的顺序给它们编号。 如果两行对所有排序关键字的排序都相同,那么对全部行依据当前语言环境的整理顺序进行比较。

对字段中的列进行编号时,缺省字段分隔符中的空格符将作为后继字段计数。 不会将由 -t 标志指定的字段分隔符算作字段的一部分。 可使用 -b 标志忽略前导空格符。

可使用下列两种方法定义排序关键字:

  • -k KeyDefinition
  • FSkipCSkip (过时版本)。

使用 -k 标志来定义排序关键字

-k KeyDefinition 标志采用下列形式:

- k [F 启动[. CStart]][ 修饰符][ , [结束[. CEnd]][ 修饰符]]

排序关键字包括所有以 FStart 变量指定的字段和 CStart 变量指定的列开头的字符及以 FEnd 变量指定的字段和 CEnd 变量指定的列结束的字符。 如果未指定 Fend,就假定行的最后一个字符。 如果未指定 CEnd,就假定 FEnd 字段的最后一个字符。 KeyDefinition 变量中的任何字段号或列号都可以省略。 缺省值为:

描述
F 启动 行开头
C 启动 字段第一列
结束 行结束
结束 字段最后一列

如果这些字段间有空格,排序将他们作为分开的几个不同字段进行处理。

Modifier 变量的值可以是一个或多个字母 bdfinr。 修饰符仅适用于它们所连接的字段定义,并且与相同字母的标志具有相同的效果。 修饰符字母 b 仅应用于其连接的字段定义的末尾。 例如:

-k 3.2b,3r

指定排序关键字,从第三字段的第二非空格列开始并扩展至第三字段结束,对这个关键字的排序以逆向整理顺序完成。 如果 FStart 变量和 CStart 变量在命令行末尾以外或在 FEnd 变量和 CEnd 变量之后,那么该排序关键字被忽略。

排序关键字也可用下列方式指定:

[+[FSkip1] [.CSkip1] [Modifier] [-[FSkip2] [.CSkip2] [Modifier]

+FSkip1 变量指定跳过的字段数以到达排序关键字第一字段,+CSkip 变量指定在该字段中跳过的列数以到达排序关键字第一个字符。 -FSkip 变量指定跳过的字段数以到达排序关键字的第一个字符,-CSkip 变量指定在该字段中跳过的列数。 可以省略任何要跳过的字段和列。 缺省值为:

描述
FSkip1 行开头
CSkip1
FSkip2 行结束
CSkip2

Modifier 变量指定的修改量与 -k 标志关键字排序定义中的相同。

因为 +FSkip1. CSkip1 变量指定到达排序关键字前要跳过多少字段和列,所以这些变量指定的字段号和列号通常比排序关键字本身的字段号和列号小 1。 例如:

+2.1b -3r

指定排序关键字,从第三字段的第二非空格列开始并扩展至第三字段结束,对这个关键字的排序以逆向整理顺序完成。 声明+2.1b指定跳过两个字段,然后跳过前导空格和另外一个列。 如果 +FSkip1. CSkip1 变量在命令行末尾以外或在 -FSkip2. CSkip2 变量之后,那么忽略该排序关键字。

注:一行的最大字段数为 32。

标志

注: A -b-d-f-i-n, 或出现在任何排序键定义之前的 -r 标志将应用于所有排序键。 -b-d-f -i-n-r 标志都不能单独出现在 -k KeyDefinition 之后;如果它们作为修饰符连接 KeyDefinition 变量,那么就只应用于连接排序关键字。 如果这些标志之一跟随在 +Fskip.Cskip-Fskip.Cskip 排序关键字定义后,那么该标志只能用于此排序关键字。
描述
-A 使用 ASCII 整理顺序代替当前语言环境的整理顺序在逐字节的基础上排序。
-b 忽略前导空格和制表符,找出字段的第一或最后列。
-c 检查输入是否已按照标志中指定的排序规则进行排序。 如果输入文件排序不正确,就返回一个非零值。
-C 检查是否依照标志中指定的排序规则对输入进行排序,例外情况是,在顺序错误时或者在检测到重复键(指定 -u 选项)时,不会向标准错误发送警告消息。
-d 使用字典顺序排序。 比较中仅考虑字母、数字和空格。
-f 比较前将所有小写字母改成大写字母。
-i 比较中忽略所有非显示字符。
-k KeyDefinition 指定排序关键字。 KeyDefinition 选项的格式为:

[F 启动[. CStart]][ 修饰符][ , [结束[. CEnd]][ 修饰符]]

排序关键字包括所有以 FStart 变量指定的字段和 CStart 变量指定的列开头的字符及以 FEnd 变量指定的字段和 CEnd 变量指定的列结束的字符。 Modifier 变量的值可以是 b, dfinr。 modifiers 等价于同一字母的标志。 将修饰符连接至键定义时,未对它引用任何标志。

-M 只合并多个输入文件;假设输入文件已经排序。
-n 按算术值对数字字段排序。 数字字段可包含前导空格、可选减号、十进制数字、千分位分隔符和可选基数符。 对包含任何非数字字符的字段进行数字排序会出现无法预知的结果。
-o OutFile 将输出指向 OutFile 参数指定的文件,而不是标准输出。 OutFile 参数值可以与 File 参数值相同。
-r 颠倒指定排序的顺序。
-t 字符 指定 Character 为单一的字段分隔符。
-U 禁止按照排序关键字和选项的所有等同排序(每一组行中一行除外)。
-T 目录 将创建的所有临时文件放入 Directory 参数指定的目录中。
-y[千字节] 使用 千字节 参数指定的主存储器千字节数启动 sort 命令,并根据需要添加存储器。 (如果 Kilobytes 参数指定的值小于最小存储站点或大于最大存储站点,就以这个最小存储站点或最大存储站点取代)。 如果省略 -y 标志,sort 命令以缺省的存储大小启动。 -y0 标志用最小存储启动,而 -y 标志(不带 Kilobytes 值)用最大存储启动。 sort 命令使用的存储量显著地影响性能。 以大存储量对小文件排序将很浪费。
-z RecordSize 如果正在排序的任一行大于缺省的缓冲区大小,要防止出现异常终止。 缺省缓冲区大小为 20 KB。 指定 -c-m 标志时,省略排序阶段,使用系统的缺省缓冲大小。 如果排序的行超过此大小,那么 sort 命令将异常终止。 -z 选项指定排序阶段最长行的记录,因而可在合并阶段分配足够的缓冲区。 RecordSize 变量必须指定一个以字节为单位的值,该值等于或大于要合并的最长行。 在 C 语言环境下支持的最长行大小大约为 2M 个字符,在非 C 语言环境下支持的最长行大小为 1M 个字符。 -z 选项在 C 语言环境下无效。

退出状态

本命令返回以下退出值:

描述
重大安全事件数量 所有输入文件成功输出,或指定了 -c 且正确排序了输入文件。
第 1 年 -c 选项下,文件没有按指定排序,或如果指定 -c-u 选项,找到了两个具有相同关键字的输入行。
> 1 发生错误。

示例

  1. 要对fruitsLC_ALLLC_COLLATELANG 环境变量设置为En_US,请输入:
    LANG=En_US sort fruits
    此命令序列显示fruits文件按升序词典顺序排序。 每一列的字符,包括空格、数字和特殊字符都经一一比较。 例如,如果fruits文件包含以下文本:
    banana
    orange
    Persimmon
    apple
    %%banana
    apple
    ORANGE
    sort 命令将显示:
    %%banana
    ORANGE
    Persimmon
    apple
    apple
    banana
    orange
    在 ASCII 整理顺序中,%(百分号) 在大写字母之前,在小写字母之前。 如果您当前的语言环境指定 ASCII 之外的字符集,结果可能不同。
  2. 要按字典顺序排序,请输入:
    sort  -d fruits
    此命令序列排序并显示fruits文件,仅比较字母,数字和空格。 如果fruits文件与示例 1 中的文件相同,那么将显示 sort 命令:
    ORANGE
    Persimmon
    apple
    apple
    %%banana
    banana
    orange
    -d 标志忽略%(百分号) 字符,因为它不是字母,数字或空格,正在放置%%banana以及banana.
  3. 要对包含大写字符和具有类似小写行的特殊字符的行进行分组,请输入:
    sort  -d -f fruits
    -d 标志忽略特殊字符,-f 标志忽略大小写差异。 将 LC_ALLLC_COLLATELANG 环境变量设置为C,输出fruits文件变为:
    apple
    apple
    %%banana
    banana
    ORANGE
    orange
    Persimmon
  4. 要排序,除去重复的行,请输入:
    sort  -d  -f  -u fruits
    -u 标志告诉 sort 命令除去重复的行,使文件中的每一行唯一。 此命令序列显示:
    apple
    %%banana
    ORANGE
    Persimmon
    不仅是重复的apple已除去,但bananaORANGE使用。 由于 -d 标志忽略%%特殊字符和 -f 标志忽略大小写差异。
  5. 要按示例进行排序 4 ,除去重复实例 (除非大写或标点不同) ,请输入:
    sort  -u +0  -d -f +0 fruits
    进入+0 -d -f执行与使用的相同类型的排序-d -f在示例 3 中。 然后+0执行另一个比较以区分不相同的行。 这防止 -u 标志将它们除去。

    给定fruits示例 1 中显示的文件,添加的+0区分%%bananabananaORANGEorange. 然而,这两种情况apple是相同的,因此将删除其中一个。

    apple
    %%banana
    banana
    ORANGE
    orange
    Persimmon
  6. 要指定用于分隔字段的字符,请输入:
    sort  -t: +1 vegetables
    此命令序列对vegetables文件,比较每行中第一个冒号后面的文本。 该+1指示 sort 命令忽略第一个字段,并从第二个字段的开头到行尾进行比较。 该-t:标志告诉 sort 命令冒号分隔字段。 如果vegetables包含:
    yams:104
    turnips:8
    potatoes:15
    carrots:104
    green beans:32
    radishes:5
    lettuce:15
    那么,将 LC_ALL LC_COLLATELANG 环境变量设置为 C 的情况下,sort 命令将显示:
    carrots:104
    yams:104
    lettuce:15
    potatoes:15
    green beans:32
    radishes:5
    turnips:8
    注意数字没有按照数字排序。 当用字典式分类从左至右比较每一个字符时出现这种情况。 换句话说,3先来5,所以32先来5.
  7. 要对数字进行排序,请输入:
    sort  -t: +1  -n vegetables
    此命令序列对vegetables第二个字段上的数字文件。 如果vegetables文件与示例 6 中的文件相同,那么将显示 sort 命令:
    radishes:5
    turnips:8
    lettuce:15
    potatoes:15
    green beans:32
    carrots:104
    yams:104
  8. 要对多个字段进行排序,请输入:
    sort  -t: +1 -2  -n +0 -1  -r vegetables
    sort  -t:  -k2,2 n -k1,1 r vegetables
    此命令序列对第二个字段执行数字排序 (+1 -2 -n)。 在该排序中,它以逆向字母顺序对第一个字段进行排序 (+0 -1 -r)。 当 LC_ALLLC_COLLATELANG 环境变量设置为 C 时,输出如下所示:
    radishes:5
    turnips:8
    potatoes:15
    lettuce:15
    green beans:32
    yams:104
    carrots:104
    此命令按数字顺序对行排序。 当两行数字相同时,它们以逆字母顺序出现。
  9. 要将原始文件替换为排序文本,请输入:
    sort  -o vegetables vegetables
    此命令序列将排序后的输出存储到vegetables文件 (-o vegetables).

文件数

描述
/usr/bin/sort 包含 sort 命令。
描述
/var/tmp sort 命令处理期间的临时空间。
/usr/tmp 如果不能在 /var/tmp 中创建文件,是 sort 命令处理期间的临时空间。
/tmp sort 命令处理期间的临时空间 (如果无法在 /var/tmp/usr/tmp中创建文件)。