(1).本手册只挑选了有用的信息进行翻译,如要查看完完整整的内容,请自行info sort。
(2).译文中,在括号中使用了"注"的,为本人所加,非原文内容,助于理解和说明。
(3).本文的sort命令为CentOS 7.2上的,版本为sort (GNU coreutils) 8.22,有些选项在CentOS 6上可能不支持,如"--debug"。
(4).在没搞懂sort处理字段和排序机制时,强烈建议不要看man sort。
7.1 'sort': Sort text files
===========================
sort命令用于排序、合并或比较给定文件(可给定多个)的所有行,如果没有给定输入文件或输入文件为"-",则读取标准输入。默认情况下,sort将操作结果打印在标准输出中。
语法:
sort [OPTION]... [FILE]...
sort有3种操作模式:排序(默认)、合并以及检查是否已经排过序。使用以下3个选项改变操作模式:
'-c'
'--check'
'--check=diagnose-first'
检查给定文件是否已经排序过:如果检测出未排序,将输出诊断信息并以状态码1退出,该诊断信息中包含第一个乱序的行。否则以成功状态退出。最多只能给定一个检测文件。
'-C'
'--check=quiet'
'--check=silent'
它类似于"-c",但不会输出诊断信息。如果文件已排序,则以成功状态退出,否则以状态码1退出。最多只能给定一个文件。
'-m'
'--merge'
合并多个文件,每个输入文件必须已经排序。合并时将根据已排序的结果合并为各个组。sort一般都用来排序,但仍然提供合并功能,因为它的合并速度很快。
sort排序规则为:按照命令行中给定的字段顺序对给定的字段进行排序,排序时根据为每个字段分配的排序选项进行排序,直到发现不同的排序选项或者排序列结束。如果没有给定排序key(注:key即为-k指定的值),则对整行进行排序。最后,如果所有给定的key的比较结果都相等时,将对整行进行完全默认的排序(注:即以字母升序排序),但"-r"可以改变这次的升、降序结果。这次排序称为"最后的排序"。使用"-s"选项可以禁止"最后的排序",使得那些排序结果相同的行保留最初的相对顺序。"-u"选项同样也会禁止"最后的排序"。
除非明确指定,否则所有的比较都按照"LC_COLLATE"指定的字符集的排序规则进行排序。
退出状态码:
0 没有任何错误发生时
1 如果"-c"或"-C"检测发现输入数据未排序时
2 发生了错误时
如果设置了环境变量"TMPDIR",sort将使用它作为临时目录而不是默认的"/tmp"。"-T"选项将覆盖该环境变量设置的值。
以下选项影响排序的输出结果。它们既可以指定为全局选项,也可以作为key的一部分。如果未指定任何key,则全局选项将作用于整行,否则指定的key将继承全局选项,除非key自身也指定了选项(注:自身指定了选项的key将覆盖全局选项)。
为了考虑可移植性,建议将全局选项指定在"-k"(或"--key")的前面。
'-b'
'--ignore-leading-blanks'
忽略key的前导空白符号(包括空格、制表符)。不给定该选项时,空白符号对"-k"选项指定字符位置有影响(注:例如"-k 2.2"指定的第2个字符可能是空白)。
'-f'
'--ignore-case'
将小写字符当作大写字符。例如,"b"和"B"是相等的。当和"-u"选项一起使用时(注:重复的行只能输出一次),那些小写字符的等价行会被丢弃(注:也就是说,输出的是大写字符行)。(目前没有任何方法可以抛弃大写字符的等价行,即使使用"-r"也不行,因为在任何时,"-r"选项都只是反转最终的排序结果,不会影响排序过程)。
'-h'
'--human-numeric-sort'
'--sort=human-numeric'
对文件大小格式进行排序。首先对正负性排序(正数>0>负数),再对大小后缀排序(0<k=K<M<G<T...),最后对数值排序。它不在乎转换精度是1000还是1024,因为它总会自动不断扩大到最接近的后缀(注:例如999M和1G比较时将以1000作为转换单位,1023M和1G比较时将以1024作为转换单位)。
'-M'
'--month-sort'
'--sort=month'
按字符格式的月份进行排序。
An initial string, consisting of any amount of blanks, followed by a month name abbreviation, is folded to UPPER case and compared in the order 'JAN' < 'FEB' < ... < 'DEC'. Invalid names compare low to valid names.
'-n'
'--numeric-sort'
'--sort=numeric'
按数值排序。空字符串""或"\0"被当作无。数值排序是精确排序,不会四舍五入后排序。
(注:数值排序和默认的排序规则所不同的是,当key中遇到非数学字符时,如空白、字母、特殊字符等,将直接结束排序(在sort内部认为找不到匹配值)。也就是说,"-k 2"和"-k 2n"不同,虽然这两个key都会扩展到行尾,前者会从第二个字段一直按字符集顺序比较到行尾,而后者可能只对第2字段匹配,因为第二字段和第三字段中间可能有特殊符号,导致数值排序直接结束。