LINUX教程:Linux sort命令中文手册(info sort翻译)
《LINUX教程:Linux sort命令中文手册(info sort翻译)》要点: 阐明: (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有3种操作模式:排序(默认)、合并以及反省是否已经排过序.使用以下3个选项改变操作模式: '-c' ? '-C' ? '-m' '--merge' ? sort排序规则为:依照命令行中给定的字段顺序对给定的字段进行排序,排序时根据为每个字段分配的排序选项进行排序,直到发现不同的排序选项或者排序列结束.如果没有给定排序key(注:key即为-k指定的值),则对整行进行排序.最后,如果所有给定的key的比较结果都相等时,将对整行进行完全默认的排序(注:即以字母升序排序),但"-r"可以改变这次的升、降序结果.这次排序称为"最后的排序".使用"-s"选项可以禁止"最后的排序",使得那些排序结果相同的行保留最初的相对顺序."-u"选项同样也会禁止"最后的排序". 除非明确指定,否则所有的比较都依照"LC_COLLATE"指定的字符集的排序规则进行排序. ? 退出状态码:
如果设置了环境变量"TMPDIR",sort将使用它作为临时目录而不是默认的"/tmp"."-T"选项将笼罩该环境变量设置的值. 以下选项影响排序的输出结果.它们既可以指定为全局选项,也可以作为key的一部分.如果未指定任何key,则全局选项将作用于整行,不然指定的key将继承全局选项,除非key自身也指定了选项(注:自身指定了选项的key将覆盖全局选项). 为了斟酌可移植性,建议将全局选项指定在"-k"(或"--key")的前面.
? '-f' ? '-h' ? '-M' ? '-n' (注:数值排序和默认的排序规则所不同的是,当key中遇到非数学字符时,如空白、字母、特殊字符等,将直接结束排序(在sort内部认为找不到匹配值).也就是说,"-k 2"和"-k 2n"不同,虽然这两个key都会扩展到行尾,前者会从第二个字段一直按字符集顺序比拟到行尾,而后者可能只对第2字段匹配,因为第二字段和第三字段中间可能有特殊符号,导致数值排序直接结束. 因此,对于"abc 100 200"这样的输入,假设字段分隔符为空格,当指定"-k 2n"时,该key为"100 200",但由于中间包括了空白,使得该key的排序在第二字段就结束.如果是"abc 100 200 200","-k 2n"在排序时,虽然看上去是100200,但却只对100进行排序,也就是说,如果此时另有一行第2字段值为110,看上去很大的100200将小于110.测试语句: 因此,对于"-n"来说,它绝对不可能跨越key的界限.但默认的排序规则会跨越key起作用.) ? '-r' ? '-k POS1[,POS2]' POS的格式为"F[.C][OPTS]",其中F表示字段的序号,C表示该字段中字符的序号.字段和字符的位置都从1开始计算.如果POS2的字符位置指定为0,则表示POS2字段中的最后一个字符.如果POS1中省略".C",则默认值为1(字段的起始字符),如果POS2中省略".C",默认值为0(字段的终止字符).OPTS为排序选项,这些选项将覆盖全局选项,使得该key可以依照独立的排序选项进行排序.keys可以跨多个字段. 示例:为了排序第二个字段,使用"--key=2,2"(-k 2,2).可使用"--debug"选项赞助查看、分析和决定每行中被用于排序的字段. ? '--debug' ? '-o OUTPUT-FILE' "cat file1 | sort -m -o file1 -" ? '-s' ? '-t SEPARATOR' 因此,如果输入行为" foo bar",默认将切分为两个字段" foo"和" bar",(注:空白和非空白字符之间的空字符为行开头和"oo"后的位置).字段分隔符不是分隔后字段中的内容,因此"sort -t ' '"对" foo bar"分隔时,将分割为3个字段:空字段、"foo"和"bar".但是,每个单独的字段都是扩展到行结尾的,就像"-k 2",或像"-k 2,3"包括了范围的字段,它们都在扩展的时候保留字段分隔符. ? '--parallel=N' ? '-u' ? "sort -u"和"sort | uniq"是等价的,但扩展了更多选项??将可能不等价,例如,"sort -n -u"只会检查数值部门的唯一性,但"sort -n | uniq"在sort对行的数值排序后,uniq将检查整个行的唯一性. ? '-z' ? "-k"指定的key后面可以指定"bfhgnr"等选项,这种情况下,该key将不会继承全局选项.除了"b"选项,所有的选项都作用于整个key,无论该选项是写在POS1还是POS2上.如果指定了"b"选项,它仅独立作用于POS1或POS2上,但如果继承了全局的"-b",则会作用于整个key上.如果输入行中包括了前导空白字符,且没有使用"-t"选项,"-k"通常会结合"-b"或某些隐含了忽略前导空白字符的选项(ghn)一起使用,否则前导空白字符可能会导致划分的字段非常混乱. 如果POS中指定的字段或字符位置超出了行尾或字段,则该key为空.如果指定了"-b"选项,".C"部门将从字段的第一个非空白字符开始计算. 以下是一些示例,用于说明分歧选项的结合使用:
sort -n -r
sort -k 3b
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按数值排序. sort -t : -k 5n -k 2
sort -t : -k 5b,5 -k 3,3n /etc/passwd sort -t : -n -k 5b,3 /etc/passwd sort -t : -b -k 5,3n /etc/passwd 以上三个命令是等价的.第一个命令指定了第一个key的POS1要忽略前导空白,且第二个key要依照数值排序.另外两个命令中,缺少选项的key将继承全局选项.此处继承之所以能正确工作,是因为"-k 5b,5b"和"-k 5b,5"是等价的.
使用单个空格可以精确分割这些字段.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 本文永远更新链接地址: 更多LINUX教程,尽在编程之家PHP学院专栏。欢迎交流《LINUX教程:Linux sort命令中文手册(info sort翻译)》! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |