linux sort 中文,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 [OPTION]… [FILE]…

sort有3种操作模式:排序(默认)、合并以及检查是否已经排过序。使用以下3个选项改变操作模式:

‘-c’

‘–check’

‘–check=diagnose-first’

检查给定文件是否已经排序过:如果检测出未排序,将输出诊断信息并以状态码1退出,该诊断信息中包含第一个乱序的行。否则以成功状态退出。最多只能给定一个检测文件。

‘-C’

‘–check=quiet’

‘–check=silent’

它类似于”-c”,但不会输出诊断信息。如果文件已排序,则以成功状态退出,否则以状态码1退出。最多只能给定一个文件。

‘–merge’

合并多个文件,每个输入文件必须已经排序。合并时将根据已排序的结果合并为各个组。sort一般都用来排序,但仍然提供合并功能,因为它的合并速度很快。

除非明确指定,否则所有的比较都按照”LC_COLLATE”指定的字符集的排序规则进行排序。

退出状态码:

0 没有任何错误发生时

1 如果”-c”或”-C”检测发现输入数据未排序时

2 发生了错误时

如果设置了环境变量”TMPDIR”,sort将使用它作为临时目录而不是默认的”/tmp”。”-T”选项将覆盖该环境变量设置的值。

以下选项影响排序的输出结果。它们

为了考虑可移植性,建议将全局选项指定在”-k”(或”–key”)的前面。

‘-b’

‘–ignore-leading-blanks’

忽略key的前导空白符号(包括空格、制表符)。不给定该选项时,空白符号对”-k”选项指定字符位置有影响(注:例如”-k 2.2″指定的第2个字符可能是空白)。

‘-f’

‘–ignore-case’

将小写字符当作大写字符。例如,”b”和”B”是相等的。当和”-u”选项一起使用时(注:重复的行只能输出一次),那些小写字符的等价行会被丢弃(注:也就是说,输出的是大写字符行)。(目前没有任何方法可以抛弃大写字符的等价行,)。

‘-h’

‘–human-numeric-sort’

‘–sort=human-numeric’

对文件大小格式进行排序。首先对正负性排序(正数>0>负数),再对大小后缀排序(0

‘-M’

‘–month-sort’

‘–sort=month’

按字符格式的月份进行排序。

An initial string, consisting of any amount of blanks, followed bya month name abbreviation, is folded to UPPER case and compared inthe order ‘JAN’ < 'FEB' < … < 'DEC'. Invalid names compare lowto valid names.

‘-n’

‘–numeric-sort’

‘–sort=numeric’

按数值排序。空字符串””或””被当作无。数值排序是精确排序,不会四舍五入后排序。

(注:

因此,对于”abc 100 200″这样的输入,假设字段分隔符为空格,当指定”-k 2n”时,该key为”100 200″,但由于中间包含了空白,使得该key的排序在第二字段就结束。如果是”abc 100200 200″,”-k 2n”在排序时,虽然看上去是100200,但却只对100进行排序,也就是说,如果此时另有一行第2字段值为110,看上去很大的100200将小于110。测试语句:

echo -e "b 100:200 200na 110 300" | tr ':' ''|sort -t ' ' -k2n -k1

因此,)

‘-r’

‘–reverse’

反转比较的结果,使得结果中更大的key更早出现。(注:)

‘-k POS1[,POS2]’

‘–key=POS1[,POS2]’

指定排序的key,即每行排序的起始和终止字段(若省略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’

‘–output=OUTPUT-FILE’

将排序的输出结果写入到OUTPUT-FILE中。一般来说,sort在打开OUTPUT-FILE前读取完所有输入,因此可以安全地将排序结果保存到输入文件中,就像”sort -o file1 file1″和”cat file1 | sort -o file1″一样。但是,”-m”选项会在读取输入前先打开输出文件,因此下面的语句是不安全的语句:

"cat file1 | sort -m -o file1 -"

‘-s’

‘–stable’

禁止sort执行”最后的排序”。在没有指定字段选项或全局选项时,该选项将不起作用,除非指定的是”-r”选项。

(注:如果未指定任何选项,其本身就是完全默认的,因此没必要再做最后的排序。如果指定的是”-r”选项,由于”-r”是对最终结果进行反转排序,因此会影响这次的”最后的排序”的结果)

‘-t SEPARATOR’

‘–field-separator=SEPARATOR’

当在每行中搜索key的时候,使用SEPARATOR字符作为字段的分隔符。默认情况下,字段是由空白字符和非空白字符之间的分割而来的。

因此,如果输入行为” foo bar”,默认将切分为两个字段” foo”和” bar”,(注:空白和非空白字符之间的空字符为行开头和”oo”后的位置)。字段分隔符不是分隔后字段中的内容,因此”sort -t ‘ ‘”对” foo bar”分隔时,将分割为3个字段:空字段、”foo”和”bar”。但是,每个单独的字段都是扩展到行结尾的,就像”-k 2″,或像”-k 2,3″包含了范围的字段,它们都在扩展的时候保留字段分隔符。

(注:以sort -t ‘ ‘为例,”-k 2″实际上表示的是”foo bar”,它扩展到行尾,且中间的字段分隔符被保留。而”-k 1,2″实际上表示的是” foo”,因为明确指定了这个key到第二个字段结束,但中间的字段分隔符仍保留)

如果要指定字段分隔符为空,则使用””,例如”sort -t ””。

‘–parallel=N’

设置sort运行的并行线程数为N。默认N设置为可获得的cpu个数,但最大限制为8,因为超过8之后带来的性能收益递减。

‘-u’

‘–unique’

一般情况下,”-u”将仅输出排序后重复行的第一行。该选项会禁止”最后的排序”(注:见前文译文)。

“sort -u”和”sort | uniq”是等价的,但扩展了更多选项��将可能不等价,例如,”sort -n -u”只会检查数值部分的唯一性,但”sort -n | uniq”在sort对行的数值排序后,uniq将检查整个行的唯一性。

‘-z’

‘–zero-terminated’

使用””分割每行而不是使用换行符。

如果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

:http://www.linuxidc.com/Linux/2017-08/146533.htm

97361c77f4c94de7fd28641cf7c42b32.gif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值