Linux命令详解-Sort
sort大家应该都用过,但是sort的真正强大之处大家有了解吗?
今天学习下sort,学习完sort之后配合上上次学习的uniq就能做很多事情了。
sort的wiki见这里:http://en.wikipedia.org/wiki/Sort_(Unix)
按照惯例,我们先man一下sort的用法
sort - sort lines of text files
看到了吗,介绍非常简单对文件的lines内容进行排序。介绍简单并不意味这功能简单,小介绍有大作用。
先看下sort的参数,关注主要使用的参数,有些参数的使用场景比较特殊,不做多介绍:
-b:进行域分割时,忽略第一个空格
-f:每行的小写字母转为大写字母进行sort
-i:忽略非打印字符,只考虑打印字符
-M:进行morth-sort:Unknown < JAN < ... < DEC
-n:按照String的numerical值进行排序
-r:默认升序排列,这个参数调整为降序排列
-kPOS1,POS2:将每行的值分割,起始于POS1,结束语POS2
-o:定义输出文件
-t:设定分隔符,和awk的-F参数一样-u:选项进行唯一性
下面我们进行sort使用分析
文件准备,使用文件corpus.txt
>>cat corpus.txt1, Justin Timberlake, Title 545, Price $7.302, Taylor Swift, Title 723, Price $7.903, Mick Jagger, Title 610, Price $7.904, Lady Gaga, Title 118, Price $7.305, Johnny Cash, Title 482, Price $6.506, Elvis Presley, Title 335, Price $7.307, John Lennon, Title 271, Price $7.908, Michael Jackson, Title 373, Price $5.50
默认按照字母升序排列
>>sort corpus.txt1, Justin Timberlake, Title 545, Price $7.302, Taylor Swift, Title 723, Price $7.903, Mick Jagger, Title 610, Price $7.904, Lady Gaga, Title 118, Price $7.305, Johnny Cash, Title 482, Price $6.506, Elvis Presley, Title 335, Price $7.307, John Lennon, Title 271, Price $7.908, Michael Jackson, Title 373, Price $5.50
-r参数调整顺序
>>sort -r corpus.txt8, Michael Jackson, Title 373, Price $5.507, John Lennon, Title 271, Price $7.906, Elvis Presley, Title 335, Price $7.305, Johnny Cash, Title 482, Price $6.504, Lady Gaga, Title 118, Price $7.303, Mick Jagger, Title 610, Price $7.902, Taylor Swift, Title 723, Price $7.901, Justin Timberlake, Title 545, Price $7.30
-k参数能够选择域,默认域是空格或者tab分割,选择第二个域进行降序排列,即人名那一列
>>sort -r -k 2 corpus.txt2, Taylor Swift, Title 723, Price $7.903, Mick Jagger, Title 610, Price $7.908, Michael Jackson, Title 373, Price $5.504, Lady Gaga, Title 118, Price $7.301, Justin Timberlake, Title 545, Price $7.305, Johnny Cash, Title 482, Price $6.507, John Lennon, Title 271, Price $7.906, Elvis Presley, Title 335, Price $7.30
-t参数能够使用自定义的分隔符 -t=","逗号分割
>>sort -t, -k4 corpus.txt8, Michael Jackson, Title 373, Price $5.505, Johnny Cash, Title 482, Price $6.501, Justin Timberlake, Title 545, Price $7.304, Lady Gaga, Title 118, Price $7.306, Elvis Presley, Title 335, Price $7.302, Taylor Swift, Title 723, Price $7.903, Mick Jagger, Title 610, Price $7.907, John Lennon, Title 271, Price $7.90
如果想同时对多列进行排序,可以使用多个-k参数
>>sort -t, -k4 -k3 corpus.txt8, Michael Jackson, Title 373, Price $5.505, Johnny Cash, Title 482, Price $6.504, Lady Gaga, Title 118, Price $7.306, Elvis Presley, Title 335, Price $7.301, Justin Timberlake, Title 545, Price $7.307, John Lennon, Title 271, Price $7.903, Mick Jagger, Title 610, Price $7.902, Taylor Swift, Title 723, Price $7.90
我想对某个域的第N个字符进行排序
>>sort -t, -k4 -k2.3 corpus.txt8, Michael Jackson, Title 373, Price $5.505, Johnny Cash, Title 482, Price $6.504, Lady Gaga, Title 118, Price $7.306, Elvis Presley, Title 335, Price $7.301, Justin Timberlake, Title 545, Price $7.302, Taylor Swift, Title 723, Price $7.903, Mick Jagger, Title 610, Price $7.907, John Lennon, Title 271, Price $7.90
选3是因为名字面前有个空格
对多个排序书序添加-r参数
>>sort -rt, -k4 -k3 corpus.txt2, Taylor Swift, Title 723, Price $7.903, Mick Jagger, Title 610, Price $7.907, John Lennon, Title 271, Price $7.901, Justin Timberlake, Title 545, Price $7.306, Elvis Presley, Title 335, Price $7.304, Lady Gaga, Title 118, Price $7.305, Johnny Cash, Title 482, Price $6.508, Michael Jackson, Title 373, Price $5.50
对比上面两个输出可以看出来,添加-r参数后,这两个排序都遵从了-r的规则,即同时升序或者降序
如果我想一个域使用升序,一个域使用降序怎么办?把r参数添加到-k后面就行
>>sort -t, -k4 -k3r corpus.txt8, Michael Jackson, Title 373, Price $5.505, Johnny Cash, Title 482, Price $6.501, Justin Timberlake, Title 545, Price $7.306, Elvis Presley, Title 335, Price $7.304, Lady Gaga, Title 118, Price $7.302, Taylor Swift, Title 723, Price $7.903, Mick Jagger, Title 610, Price $7.907, John Lennon, Title 271, Price $7.90
-r参数位置的不同可以控制不同的排序标准,这个一定要牢记。
注意这个-r参数直接写在sort命令上和挂载-k后面是不一样的,具体怎么的不一致各位同学可以自己验证下
-n参数能够把该域按照数字进行排序
>>sort -n -k5 corpus.txt4, Lady Gaga, Title 118, Price $7.307, John Lennon, Title 271, Price $7.906, Elvis Presley, Title 335, Price $7.308, Michael Jackson, Title 373, Price $5.505, Johnny Cash, Title 482, Price $6.501, Justin Timberlake, Title 545, Price $7.303, Mick Jagger, Title 610, Price $7.902, Taylor Swift, Title 723, Price $7.90
最后给个sort的奇怪用法,-R=random-sort
>>sort -R corpus.txt 8, Michael Jackson, Title 373, Price $5.507, John Lennon, Title 271, Price $7.904, Lady Gaga, Title 118, Price $7.302, Taylor Swift, Title 723, Price $7.901, Justin Timberlake, Title 545, Price $7.303, Mick Jagger, Title 610, Price $7.905, Johnny Cash, Title 482, Price $6.506, Elvis Presley, Title 335, Price $7.30
多执行几次,可以发现每次执行的结果都不一样。其实可以看做是将输出结果随机化,不知道这种方法的随机效果怎么样。
注意,这个方法和平台有关,有可能你的*nix系统没有这个random-sort参数
现在看到某些sort命令会有+1,-1这些符号,这些符号是怎么回事?
这个是sort参数的古老的表示形式,现在已经在新的平台上已经不再使用,应该在某些平台上还在支持,我自己的机器就不支持这种语法。
下面我们使用sort来实践一下,做几个例子:
1:获得目录下文件大小的顺序
ls -al | sort -k5 -rn
你可以放到任何目录下,执行以下上面这个命令看下结果
2:获得当前系统中运行的最占内存的前10个程序
ps aux | sort -k 6 -rn | head -n10
3:看看你最常使用的前十个shell命令
history | sort -k4 | awk '{print $4}' | uniq -c | sort -k1 -nr | head -n10
执行以下,看看你最常用的shell命令是什么,也看下你是个什么类型的程序猿或者程序媛
有没有觉得很有意思。
上面的这些命令参数应该能帮助你完成大部分的工作内容,但是如果你不满意,还想了解sort更多的理论知识,可以看下这篇文章:http://www.cnblogs.com/51linux/archive/2012/05/23/2515299.html。本文的内容和这篇文章类似,只是偏重于应用,并且只采用corpus.txt文件作为示例,方便命令前后的对比。