"sort -u"和"sort | uniq"是等价的,但扩展了更多选项后将可能不���价,例如,"sort -n -u"只会检查数值部分的唯一性,但"sort -n | uniq"在sort对行的数值排序后,uniq将检查整个行的唯一性。
'-z'
'--zero-terminated'
使用"\0"分割每行而不是使用换行符。
"-k"指定的key后面可以指定"bfhgnr"等选项,这种情况下,该key将不会继承全局选项。除了"b"选项,所有的选项都作用于整个key,无论该选项是写在POS1还是POS2上。如果指定了"b"选项,它仅独立作用于POS1或POS2上,但如果继承了全局的"-b",则会作用于整个key上。如果输入行中包含了前导空白字符,且没有使用"-t"选项,"-k"通常会结合"-b"或某些隐含了忽略前导空白字符的选项(ghn)一起使用,否则前导空白字符可能会导致划分的字段非常混乱。
如果POS中指定的字段或字符位置超出了行尾或字段,则该key为空。如果指定了"-b"选项,".C"部分将从字段的第一个非空白字符开始计算。
以下是一些示例,用于说明不同选项的结合使用:
按数值排序,并降序(reverse)
sort -n -r
按字母排序,忽略第一和第二字段,且忽略第三字段的前导空白。此处使用了单个key,该key从第三字段非空白字符开始,一直扩展到行的结尾。这一整个key都采用字母排序。
sort -k 3b
对第二字段按数值排序,并通过指定第五字段的第3、4字符间按字母排序来解除按数值排序的规则。使用":"作为字段分隔符。
sort -t : -k 2,2n -k 5.3,5.4
(注:任何时候,只想对某字段进行排序时,都建议明确指定其起始和结束位置)
注意,如果写的是"-k 2n"而不是"-k 2,2n",该key将从第二字段一直扩展到行尾,这是主排序key,而副排序key"-k 5.3,5.4"在主排序key的排序基础上再按照字母排序。绝大多数情况下,让key向后扩展一般不是所期望的行为。
还需注意,"n"选项作用范围为第一个key。这等价于"-k 2n,2"或"-k 2n,2n"。所有的修饰符,除了"-b",无论写在pos1还是pos2,都会作用于整个key。
(注:由于n选项无法跨越key,因此上面即使写成了"-k 2n"也是等价的,但下面两个命令则不一样:
sort -t : -k 2 -k 5.3,5.4n sort -t : -k 2,2 -k 5.3,5.4n
由于默认的字符集排序规则会跨越key,第一条命令中主key从第2字段开始,直到行尾结束,于是会先对整个key按字符排序,然后在此基础上再对副key按数值排序。
再如下面的例子:即使主key的字段在副key的字段后面,副key由于是做字符集排序,所以仍会跨越主key。)
sort -t : -k 5n -k 2
对/etc/passwd文件的第5字段排序,并忽略前导空白。如果第5字段排序结果相等,则进一步按数值对第3字段的uid进行排序。字段分隔符为":"。
sort -t : -k 5b,5 -k 3,3n /etc/passwd sort -t : -n -k 5b,5 -k 3,3 /etc/passwd sort -t : -b -k 5,5 -k 3,3n /etc/passwd
以上三个命令是等价的。第一个命令指定了第一个key的POS1要忽略前导空白,且第二个key要按照数值排序。另外两个命令中,缺少选项的key将继承全局选项。此处继承之所以能正确工作,是因为"-k 5b,5b"和"-k 5b,5"是等价的。
对一系列日志文件进行排序,主排序key为IPv4,副排序key为时间戳。如果两行的主、副key都完全一致,则按照文件被读取时的相对顺序输出。日志文件包含的行格式大致如下:
4.150.156.3 - - [01/Apr/2004:06:31:51 +0000] message 1
211.24.3.231 - - [24/Apr/2004:20:17:39 +0000] message 2
使用单个空格可以精确分割这些字段。IPV4地址列按照字典顺序排序,例如212.61.52.2小于212.129.233.201,因为61小于129。
sort -s -t ' ' -k 4.9n -k 4.5M -k 4.2n -k 4.14,4.21 file*.log |\ sort -s -t '.' -k 1,1n -k 2,2n -k 3,3n -k 4,4n
该示例无法仅使用一个sort语句实现,因为IPV4地址需要使用"."分隔,而时间戳需要使用空格分隔。因此,使用两个sort语句:第一个sort语句按照时间戳排序,第二个语句按照IPV4排序。第一个sort命令中使用"-k"将每个字段进行隔离,先按照年排序,再按照月份排序,接着是日,最后对"时:分:秒"排序。除了"时:分:秒"这个key,其余的key都没必要指定key的结束位置,因为"n"和"M"选项作用范围不能跨域每个key的左边界。第二个sort命令是对ipv4地址按照字典顺序排序的。第二个sort语句中使用了"-s"选项,以防止主排序key的关系被副排序key破坏,第一个sort语句中使用"-s"选项是为了保证两个sort语句在"-s"属性上的一致性。
(注:由于n选项无法跨越key边界和非数学字符,因此上面第二个sort命令和下面的命令是等价的:)
sort -s -t '.' -n -k1 -k2 -k3 -k4