在sort命令上吃了不少亏,要好好补一课

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

sort [-bcfMnrtk][源文件][-o 输出文件]

补充说明:sort可针对文本文件的内容,以行为单位来排序。

参  数:

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

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

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

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

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

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

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

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

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

1. 一直都没怎么把sort命令放在心上,除了ls -lt根据时间排序文件外,自认为排序的功能用得少。

但事实是,每次遇到问题了,只能一个一个去尝试——怎么还是没有排序输出我想要的结果呢?

比如前不久过滤日志中所有sql执行的时间,自己写出来的bash命令输出的就是按照默认的字典排序的,而不是数字排序。

现在想想才知道要用 -n -k1 这样的参数。但是情急之下却想不起来这些的。

2. 所以,今天好好补习下sort命令。防止以后掉入同样的问题之中。

3. 先看鸟哥的书:

a. sort 可以使用文字和数字排序,并且排序结果和字符和语系的编码有关,建议使用LANG=C来统一语系,对数字排序会好一些。

b. 参数:

-f 忽略字符的大小写

-b 忽略最前的空格, 以后不用非要去掉空格了

-M 以月份的名字来排序

-n 使用纯数字排序,默认则是使用文字排序

-r 反向排序

-u uniq,相同的数据仅出现一行在结果中

-t 分隔符,默认为tab

-k 使用哪个区间来排序

c. 看完参数后发现, -b,-n,-t,-k 都是最常用的,还有-u(只是最好知道重复次数)。这些参数以前没有用的时候,就必须处理输入的数据,比如一处空格或分隔符,只留一列,其实都不用了。比如现在写下面的就可以了:

sort -k1 -r -n -u sql_time.txt

d.  之前使用过 -g 的参数, 对比-n参数,二者说明为:

-g, --general-numeric-sort  compare according to general numerical value

-n, --numeric-sort          compare according to string numerical value

e. 看过上面的参数说明后,我想出来的一个语句的对比:

使用campid按照数字大小逆序输出,指定分隔符为-,使用分隔符后的id(-k2)作为排序列(如果是-k1那就自然没有效果啊!):

1956 $ redisc keys "camp-*"|sort -r -t"-" -k2 -n |head

camp-3491

camp-3200

camp-3199

camp-3198

camp-3197

不指定分隔符,那就只有一列,怎么排序都是文字排序的结果,加-k1,-k2没有意义了:

[root@mc-ssp@~@17:21:39]

1957 $ redisc keys "camp-*"|sort -r -n |head

camp-760c62

camp-760c44

camp-760c42

camp-760c37

f. 查看最近登录中所有ip的次数(使用grep过滤不含有ip的空白行,不规范行):

1981 $ last|awk '{print $3}'|sort -n|uniq -c

1984 $ last|awk '{print $3}'|grep -E '^[0-9].*'|sort|uniq -c

14 119.57.32.69

2 123.112.231.238

2 123.120.244.22

2 123.120.248.64

g. 查看/etc/passwd内容规律:

1995 $ cat /etc/passwd|awk -F ":" '{print $NF}'|sort|uniq -c

1

2 /bin/bash

14 /bin/false

1 /bin/sync

1 /sbin/nologin

17 /usr/sbin/nologin

4.鸟哥的书就讲了这么多,后面是结合uniq. 开始看博客:

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

-o 排序结果保存到指定文件

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

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

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

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

sort -r number.txt -o number.txt

下面的例子让我想起excel,报表排序这些事情,还是挺常用的啊

[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

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

5. sort命令的参数都过了一遍了,以后应该会在实践中多举一反三啦。

cut -d: -f1 /etc/passwd|sort   字典排序输出所用用户名

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容