sort是在Linux里非常常用的一个命令,它将文件进行排序,并将排序结果标准输出。sort命令既可以从特定的文件,也可以从stdin中获取输入。
sort命令语法
sort 选项 参数
常用选项
- -b:忽略每行前面开始处的空格字符;
- -c:检查文件是否已经按照顺序排序,排序过为真;
- -d:排序时,处理英文字母、数字和空格字符,以字典顺序排序。忽略其他所有字符;
- -f:排序时,将小写字母视为大写字母;
- -i:排序时,处理040~176之间的ASCII字符,忽略其他所有字符;
- -m:将几个排序好的文件进行合并;
- -M:将前面3个字母按月份的缩写进行排序;
- -n:按照数值大小进行排序;
- -o outfile.txt:将排序后的结果存入outfile.txt;
- -r:以相反的顺序进行排序;
- -k:指定需要排序的列数(栏数);
- -t 分隔符:指定排序时所用到的栏位分隔符;
- + 起始栏位 - 结束栏位:以指定的栏位来排序,范围从起始栏位到结束栏位的前一栏位。(古老的用法)
sort常见用法
sort将文件/文本的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。
[root@mail text]# cat sort.txt
aaa:10:1.1
ccc:30:3.3
ddd:40:4.4
bbb:20:2.2
eee:50:5.5
eee:50:5.5
[root@mail text]# sort sort.txt
aaa:10:1.1
bbb:20:2.2
ccc:30:3.3
ddd:40:4.4
eee:50:5.5
eee:50:5.5
忽略相同行使用-u选项或者uniq:
[root@mail text]# cat sort.txt aaa:10:1.1 ccc:30:3.3 ddd:40:4.4 bbb:20:2.2 eee:50:5.5 eee:50:5.5 [root@mail text]# sort -u sort.txt aaa:10:1.1 bbb:20:2.2 ccc:30:3.3 ddd:40:4.4 eee:50:5.5 或者 [root@mail text]# uniq sort.txt aaa:10:1.1 ccc:30:3.3 ddd:40:4.4 bbb:20:2.2 eee:50:5.5
sort的-n、-r、-k、-t选项的使用:
[root@mail text]# cat sort.txt AAA:BB:CC aaa:30:1.6 ccc:50:3.3 ddd:20:4.2 bbb:10:2.5 eee:40:5.4 eee:60:5.1 #将BB列按照数字从小到大顺序排列: [root@mail text]# sort -nk 2 -t: sort.txt AAA:BB:CC bbb:10:2.5 ddd:20:4.2 aaa:30:1.6 eee:40:5.4 ccc:50:3.3 eee:60:5.1 #将CC列数字从大到小顺序排列: [root@mail text]# sort -nrk 3 -t: sort.txt eee:40:5.4 eee:60:5.1 ddd:20:4.2 ccc:50:3.3 bbb:10:2.5 aaa:30:1.6 AAA:BB:CC # -n是按照数字大小排序,-r是以相反顺序,-k是指定需要爱排序的栏位,-t指定栏位分隔符为冒号
-k选项的具体语法格式:
-k选项的语法格式:
FStart.CStart Modifie,FEnd.CEnd Modifier -------Start--------,-------End-------- FStart.CStart 选项 , FEnd.CEnd 选项
这个语法格式可以被其中的逗号(“,”)分为两大部分,Start部分和End部分。Start部分也由三部分组成,其中的Modifier部分就是我们之前说过的类似n和r的选项部分。我们重点说说Start部分的FStart和C.Start。C.Start也是可以省略的,省略的话就表示从本域的开头部分开始。FStart.CStart,其中FStart就是表示使用的域,而CStart则表示在FStart域中从第几个字符开始算“排序首字符”。同理,在End部分中,你可以设定FEnd.CEnd,如果你省略.CEnd,则表示结尾到“域尾”,即本域的最后一个字符。或者,如果你将CEnd设定为0(零),也是表示结尾到“域尾”。
从公司英文名称的第二个字母开始进行排序:
$ sort -t ' ' -k 1.2 facebook.txt baidu 100 5000 sohu 100 4500 google 110 5000 guge 50 3000
使用了-k 1.2,表示对第一个域的第二个字符开始到本域的最后一个字符为止的字符串进行排序。你会发现baidu因为第二个字母是a而名列榜首。sohu和 google第二个字符都是o,但sohu的h在google的o前面,所以两者分别排在第二和第三。guge只能屈居第四了。
只针对公司英文名称的第二个字母进行排序,如果相同的按照员工工资进行降序排序:
$ sort -t ' ' -k 1.2,1.2 -nrk 3,3 facebook.txt baidu 100 5000 google 110 5000 sohu 100 4500 guge 50 3000
由于只对第二个字母进行排序,所以我们使用了-k 1.2,1.2 的表示方式,表示我们“只”对第二个字母进行排序。(如果你问“我使用-k 1.2怎么不行?”,当然不行,因为你省略了End部分,这就意味着你将对从第二个字母起到本域最后一个字符为止的字符串进行排序)。对于员工工资进行排 序,我们也使用了-k 3,3,这是最准确的表述,表示我们“只”对本域进行排序,因为如果你省略了后面的3,就变成了我们“对第3个域开始到最后一个域位置的内容进行排序” 了。
uniq命令
uniq命令常用语报告或者消除文件中的重复内容,一般与sort命令结合使用。
命令选项
- -c:在每行开头显示重复行出现的次数;
- -d:仅显示重复的列;
- -f 栏位:忽略指定的栏;
- -s N:指定可以跳过前N个字符;
- -w 字符位数:指定用于比较的最大字符数;
- -u:仅显示出现一次的行列;
uniq用法
删除重复行:
uniq file.txt sort file.txt | uniq sort -u file.txt
只显示单一行:
uniq -u file.txt sort file.txt | uniq -u
统计各行在文件中出现的次数:
sort file.txt | uniq -c
在文件中找出重复的行:
sort file.txt | uniq -d
unix/liunx uniq详解 uniq:
功能说明:检查及删除文本文件中重复出现的行列。
语 法:uniq [-cdu][-f<栏位>][-s<字符位置>][-w<字符位置>] [--help][--version][输入文件][输出文件]
补充说明:uniq可检查文本文件中重复出现的行列。
注意: uniq所认为的重复行是指连续出现的重复行!
参 数: -c或--count 在每列旁边显示该行重复出现的次数。
-d或--repeated 仅显示重复出现的行列。
-f<栏位>或--skip-fields=<栏位> 忽略比较指定的栏位。
-s<字符位置>或--skip-chars=<字符位置> 忽略比较指定的字符。
-u或--unique 仅显示出一次的行列。
-w<字符位置>或--check-chars=<字符位置> 指定要比较的字符。
--help 显示帮助。
--version 显示版本信息。
[输入文件] 指定已排序好的文本文件。
[输出文件] 指定输出的文件。
我们看日志的时候,可以先用-s或-f跳过日期,再去掉重复行。
用uniq命令可以删除相邻的重复行:
uniq [file]
但如果一文本中有重复却不相邻的行则无法删除,需要结合sort命令:
sort [file]|uniq
等效的sort命令是:
sort -u [file]
另外uniq命令有4个有用的选项:
$uniq -d file 只输出file中的重复行,且只输出一次,但不输出唯一的行
$uniq -u file 只输出file中的唯一行(当然是一次啦)
$uniq -c file 在每行前显示重复次数,可与其他选项结合,例如-cu或-cd或-c
$uniq -i file 比较时忽略大小写
-d 的结果和-u 的结果合并起来就是uniq的结果了。
- [root@AY140417160054681ae5Z ~]# cat >seq.txt
- banana
- apple
- pear
- orange
- banana
- [root@AY140417160054681ae5Z ~]# sort seq.txt | uniq -c
- 1 apple
- 2 banana
- 2 orange
- 1 pear