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 字典排序输出所用用户名