sort
格式:sort [-options] filename[s]
功能:将文件的每一行作为一个单位,相互比较,最后将他们按升序输出,比较原则是从首字符向后,依次按ASCII码值进行比较。
[root@justin ~]# cat /home/passwd 2 3 4 1 3 banana Pear orange pear [root@justin ~]# sort /home/passwd 1 2 3 3 4 banana orange pear Pear [root@justin ~]#
options
-f :忽略大小写的差异,例如 A 与 a 视为编码相同;(将小写字母都转换为大写字母来进行比较)
-b :忽略最前面的空格符部分;
[root@justin ~]# cat /home/passwd|sort apple:10:2.5 nana:30:5.5 orange:20:3.4 pear:90:2.3 [root@justin ~]# cat /home/passwd|sort -b apple:10:2.5 nana:30:5.5 orange:20:3.4 pear:90:2.3 [root@justin ~]#
好像没啥区别?
-M :将前面3个字母依照月份的缩写进行排序,例如 JAN, DEC 等等的排序方法;
-n :使用『纯数字』进行排序(默认是以字符型态来排序的);
[root@justin ~]# cat /home/passwd 1 4 3 5 30 2 [root@justin ~]# cat /home/passwd |sort 1 2 3 30 4 5 [root@justin ~]# cat /home/passwd |sort -n 1 2 3 4 5 30 [root@justin ~]#
默认以字符进行行间比较,30会先去比较3再去比较0,3比4小,所以30排在了4前面
-r :反向排序;
[root@justin ~]# cat /home/passwd 1 4 3 5 2 [root@justin ~]# cat /home/passwd |sort 1 2 3 4 5 [root@justin ~]# cat /home/passwd |sort -r 5 4 3 2 1 [root@justin ~]#
-o:重定向输出文件,默认是把结果输出到标准输出
[root@justin ~]# cat /home/passwd 1 4 2 20 3 5 [root@justin ~]# sort -n /home/passwd > /home/passwd1 [root@justin ~]# cat /home/passwd 1 4 2 20 3 5 [root@justin ~]# cat /home/passwd1 1 2 3 4 5 20 [root@justin ~]# sort -n /home/passwd > /home/passwd [root@justin ~]# cat /home/passwd [root@justin ~]# cp /home/passwd1 /home/passwd cp:是否覆盖"/home/passwd"? y [root@justin ~]# sort -n /home/passwd -o /home/passwd [root@justin ~]# cat /home/passwd 1 2 3 4 5 20 [root@justin ~]#
sort默认是把结果输出到标准输出,所以需要用重定向才能将结果写入文件,如果将排序的结果通过重定向符(>)重定向到新文件中会正常显示,如果重定向到本文件中本文件内容就会被清空,只是不能用重定向符而需要使用参数-o
-u :就是 uniq ,相同的数据中,仅出现一行;
[root@justin ~]# cat /home/passwd 1 2 3 4 3 2 3 [root@justin ~]# cat /home/passwd|sort 1 2 2 3 3 3 4 [root@justin ~]# cat /home/passwd|sort -u 1 2 3 4 [root@justin ~]#
-t :分隔符,默认是用 [tab] 键来分隔;
-k :以那个区间 (field) 来进行排序的意思
文件/home/passwd里有三列,列与列之间用冒号隔开了,第一列表示水果类型,第二列表示水果数量,第三列表示水果价格,现以水果数量来排序,也就是以第二列来排序,这时就需要用到-t选项来指定分隔符(和前面awk的-f,cut的-d类似),然后通过-k来指定列数
[root@justin ~]# cat /home/passwd nana:30:5.5 apple:10:2.5 pear:90:2.3 orange:20:3.4 [root@justin ~]# sort -n -t ':' -k 2 /home/passwd apple:10:2.5 orange:20:3.4 nana:30:5.5 pear:90:2.3 [root@justin ~]# sort -nr -t: -k 2 /home/passwd pear:90:2.3 nana:30:5.5 orange:20:3.4 apple:10:2.5 [root@justin ~]#
以冒号为分隔符安装第二列的数字为单位进行降序排序,如果第二列相同再安装第三列以数字为单位进行升序排序
[root@justin ~]# cat /home/passwd nana:30:5.5 apple:10:2.5 pear:10:2.3 orange:20:3.4 [root@justin ~]# sort -t ':' -k 2nr -k 3n /home/passwd nana:30:5.5 orange:20:3.4 pear:10:2.3 apple:10:2.5 [root@justin ~]#
根据列去重
例如:根据第二列来去重,只显示一个User_Alias、Host_Alias、Cmnd_Alias、Runas_Alias,使用-k2,2来去重, -k 指定从第几列到第几列作为去重标准
[root@localhost ~]# grep -iE "User_Alias|Host_Alias|Cmnd_Alias|Runas_Alias" /etc/sudoers|sort -k2 -u # Cmnd_Alias DELEGATING = /usr/sbin/visudo, /bin/chown, /bin/chmod, /bin/chgrp # Cmnd_Alias DRIVERS = /sbin/modprobe # Cmnd_Alias LOCATE = /usr/bin/updatedb # Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool # Cmnd_Alias PROCESSES = /bin/nice, /bin/kill, /usr/bin/kill, /usr/bin/killall # Cmnd_Alias SERVICES = /sbin/service, /sbin/chkconfig, /usr/bin/systemctl start, /usr/bin/systemctl stop, /usr/bin/systemctl reload, /usr/bin/systemctl restart, /usr/bin/systemctl status, /usr/bin/systemctl enable, /usr/bin/systemctl disable # Cmnd_Alias SOFTWARE = /bin/rpm, /usr/bin/up2date, /usr/bin/yum # Cmnd_Alias STORAGE = /sbin/fdisk, /sbin/sfdisk, /sbin/parted, /sbin/partprobe, /bin/mount, /bin/umount # Host_Alias FILESERVERS = fs1, fs2 # Host_Alias MAILSERVERS = smtp, smtp2 # User_Alias ADMINS = jsmith, mikem [root@localhost ~]# grep -iE "User_Alias|Host_Alias|Cmnd_Alias|Runas_Alias" /etc/sudoers|sort -k2,2 -u # Cmnd_Alias NETWORKING = /sbin/route, /sbin/ifconfig, /bin/ping, /sbin/dhclient, /usr/bin/net, /sbin/iptables, /usr/bin/rfcomm, /usr/bin/wvdial, /sbin/iwconfig, /sbin/mii-tool # Host_Alias FILESERVERS = fs1, fs2 # User_Alias ADMINS = jsmith, mikem [root@localhost ~]#
uniq
格式:uniq [-ptions]
功能:去除排序过的文件中的重复行,因此uniq经常和sort合用。也就是说,为了使uniq起作用,所有的重复行必须是相邻的
option:
-i :不区分大小写 ;
[root@justin ~]# sort /home/passwd|uniq apr Apr Jan Jul [root@justin ~]# sort /home/passwd|uniq -i apr Jan Jul [root@justin ~]#
-c --count:在每行前加上表示相应行目出现次数的前缀编号
[root@justin ~]# cat /home/passwd 1 2 3 4 3 2 3 [root@justin ~]# cat /home/passwd|sort 1 2 2 3 3 3 4 [root@justin ~]# cat /home/passwd|sort|uniq -c 1 1 2 2 3 3 1 4 [root@justin ~]#
-u :只显示唯一的行
[root@justin ~]# sort /home/passwd|uniq -ic 2 apr 1 Jan 1 Jul [root@justin ~]# sort /home/passwd|uniq -iu Jan Jul [root@justin ~]#
-d --repeated:只输出重复的行
[root@justin ~]# sort /home/passwd|uniq -ic 2 apr 1 Jan 1 Jul [root@justin ~]# sort /home/passwd|uniq -id apr [root@justin ~]#
-D --all-repeated: 只输出重复的行,不过有几行输出几行
[root@justin ~]# sort /home/passwd|uniq -ic 2 apr 1 Jan 1 Jul [root@justin ~]# sort /home/passwd|uniq -iD apr Apr [root@justin ~]#
-f --skip-fields=N:-f 忽略的段数,-f 1 忽略第一段
-s --skip-chars=N:根-f有点像,不过-s是忽略,后面多少个字符 -s 5就忽略后面5个字符