linux之sort用法

 

sort命令是帮我们依据不同的数据类型进行排序,其语法及常用参数格式:   

sort [-bcfMnrtk][源文件][-o 输出文件] 补充说明:sort可针对文本文件的内容,以行为单位来排序。

参  数:  

 -b   忽略每行前面开始出的空格字符。  

 -c   检查文件是否已经按照顺序排序。  

 -f   排序时,忽略大小写字母。  

 -M   将前面3个字母依照月份的缩写进行排序。  

 -n   依照数值的大小排序。  

 -o<输出文件>   将排序后的结果存入指定的文件。

  -r   以相反的顺序来排序。  

 -t<分隔字符>   指定排序时所用的栏位分隔字符。  

-k  选择以哪个区间进行排序。   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

下面通过几个例子来讲述Sort的使用。
(1)sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。

[rocrocket@rocrocket programming]$ cat seq.txt

banana

apple

pear

orange

[rocrocket@rocrocket programming]$ sort seq.txt

apple

banana

orange

pear

用户可以保存排序后的文件内容,或把排序后的文件内容输出至打印机。下例中用户把排序后的文件内容保存到名为result的文件中。 $ Sort seq.txt > result

(2)sort的-u选项

它的作用很简单,就是在输出行中去除重复行。

[rocrocket@rocrocket programming]$ cat seq.txt

banana

apple

pear

orange

pear

[rocrocket@rocrocket programming]$ sort seq.txt

apple

banana

orange

pear

pear

[rocrocket@rocrocket programming]$ sort -u seq.txt

apple

banana

orange

pear

pear由于重复被-u选项无情的删除了。

(3)sort的-r选项

sort默认的排序方式是升序,如果想改成降序,就加个-r就搞定了。

[rocrocket@rocrocket programming]$ cat number.txt

1 3 5 2 4

[rocrocket@rocrocket programming]$ sort number.txt

1 2 3 4 5

[rocrocket@rocrocket programming]$ sort -r number.txt

5 4 3 2 1

(5)sort的-o选项

由于sort默认是把结果输出到标准输出,所以需要用重定向才能将结果写入文件,形如sort filename > newfile。

但是,如果你想把排序结果输出到原文件中,用重定向可就不行了。

[rocrocket@rocrocket programming]$ sort -r number.txt > number.txt

[rocrocket@rocrocket programming]$ cat number.txt

[rocrocket@rocrocket programming]$

看,竟然将number清空了。

就在这个时候,-o选项出现了,它成功的解决了这个问题,让你放心的将结果写入原文件。这或许也是-o比重定向的唯一优势所在。

[rocrocket@rocrocket programming]$ cat number.txt

1 3 5 2 4

[rocrocket@rocrocket programming]$ sort -r number.txt -o number.txt

[rocrocket@rocrocket programming]$ cat number.txt

5 4 3 2 1

(6) sort的-n选项

你有没有遇到过10比2小的情况。我反正遇到过。出现这种情况是由于排序程序将这些数字按字符来排序了,排序程序会先比较1和2,显然1小,所以就将10放在2前面喽。这也是sort的一贯作风。

我们如果想改变这种现状,就要使用-n选项,来告诉sort,“要以数值来排序”!

[rocrocket@rocrocket programming]$ cat number.txt

1 10 19 11 2 5

[rocrocket@rocrocket programming]$ sort number.txt

1 10 11 19 2 5

[rocrocket@rocrocket programming]$ sort -n number.txt

1 2 5 10 11 19

(7) sort的-t选项和-k选项

如果有一个文件的内容是这样:

[rocrocket@rocrocket programming]$ cat facebook.txt

banana:30:5.5

apple:10:2.5

pear:90:2.3

orange:20:3.4

这个文件有三列,列与列之间用冒号隔开了,第一列表示水果类型,第二列表示水果数量,第三列表示水果价格。那么我想以水果数量来排序,也就是以第二列来排序,如何利用sort实现?幸好,sort提供了-t选项,后面可以设定间隔符。指定了间隔符之后,就可以用-k来指定列数了。

[rocrocket@rocrocket programming]$ sort -n -k 2 -t ‘:’ facebook.txt

apple:10:2.5

orange:20:3.4

banana:30:5.5

pear:90:2.3

(8) 其他的sort常用选项

-f会将小写字母都转换为大写字母来进行比较,亦即忽略大小写

-c会检查文件是否已排好序,如果乱序,则输出第一个乱序的行的相关信息,最后返回1

-C会检查文件是否已排好序,如果乱序,不输出内容,仅返回1

-M会以月份来排序,比如JAN小于FEB等等

-b会忽略每一行前面的所有空白部分,从第一个可见字符开始比较。

 

uniq

标志
-c 在输出行前面加上每行在输入文件中出现的次数。
-d 仅显示重复行。
-u 仅显示不重复的行。
 
head

概述:head命令用于显示文件文字区块

1、格式

  head 【参数】【文件】

2、参数

  -q 隐藏文件名

  -v 显示文件名

  -c<字节> 显示字节数

  -n<行数> 显示的行数

 

sed命令

  1.  实例  
  2. 删除:d命令  
  3. *  
  4. $ sed '2d' example-----删除example文件的第二行。  
  5. *  
  6. $ sed '2,$d' example-----删除example文件的第二行到末尾所有行。  
  7. *  
  8. $ sed '$d' example-----删除example文件的最后一行。  
  9. *  
  10. $ sed '/test/'d example-----删除example文件所有包含test的行。  
  11. 替换:s命令  
  12. *  
  13. $ sed 's/test/mytest/g' example-----在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。  
  14. *  
  15. $ sed -n 's/^test/mytest/p' example-----(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。  
  16. *  
  17. $ sed 's/^192.168.0.1/&localhost/' example-----&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加 localhost,变成192.168.0.1localhost。  
  18. *  
  19. $ sed -n 's/\(love\)able/\1rs/p' example-----love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。  
  20. *  
  21. $ sed 's#10#100#g' example-----不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。  
  22. 选定行的范围:逗号  
  23. *  
  24. $ sed -n '/test/,/check/p' example-----所有在模板test和check所确定的范围内的行都被打印。  
  25. *  
  26. $ sed -n '5,/^test/p' example-----打印从第五行开始到第一个包含以test开始的行之间的所有行。  
  27. *  
  28. $ sed '/test/,/check/s/$/sed test/' example-----对于模板test和west之间的行,每行的末尾用字符串sed test替换。  
  29. 多点编辑:e命令  
  30. *  
  31. $ sed -e '1,5d' -e 's/test/check/' example-----(-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除15行,第二条命令用check替换test。命令的执 行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。  
  32. *  
  33. $ sed --expression='s/test/check/' --expression='/love/d' example-----一个比-e更好的命令是--expression。它能给sed表达式赋值。  
  34. 从文件读入:r命令  
  35. *  
  36. $ sed '/test/r file' example-----file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面。  
  37. 写入文件:w命令  
  38. *  
  39. $ sed -n '/test/w file' example-----在example中所有包含test的行都被写入file里。  
  40. 追加命令:a命令  
  41. *  
  42. $ sed '/^test/a\\--->this is a example' example<-----'this is a example'被追加到以test开头的行后面,sed要求命令a后面有一个反斜杠。  
  43. 插入:i命令  
  44. $ sed '/test/i\\  
  45. new line  
  46. -------------------------' example  
  47. 如果test被匹配,则把反斜杠后面的文本插入到匹配行的前面。  
  48. 下一个:n命令  
  49. *  
  50. $ sed '/test/{ n; s/aa/bb/; }' example-----如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续。  
  51. 变形:y命令  
  52. *  
  53. $ sed '1,10y/abcde/ABCDE/' example-----把1--10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令。  
  54. 退出:q命令  
  55. *  
  56. $ sed '10q' example-----打印完第10行后,退出sed。  
  57. 保持和获取:h命令和G命令  
  58. *  
  59. $ sed -e '/test/h' -e '$G example-----在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将 打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保 持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中 的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。  
  60. 保持和互换:h命令和x命令  
  61. *  
  62. $ sed -e '/test/h' -e '/check/x' example -----互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换。  
  63. 7. 脚本  
  64. Sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。  

截取某段时间的日志

sed -n '/Apr 19 21:58:15/,/Apr 19 22:22:32/p' /var/log/messages