语法:
sort [选项] 文件
说明:sort命令对指定文件中所有的行进行排序,并将结果显示在标准输出上。如不指定输入文件或使用“- ”,则表示排序内容来自标准输入。
二、常用排序
1、默认排序
a.排序时,默认是按每行/每个域的首字符排序,数字的优先级要大于字符的优先级;字符的优先级大于中文的优先级
b.缺省情况下以整行为关键字按ASCII字符顺序进行排序
c.不指定升序还是降序时,默认是升序
d.有多个域时,默认根据第1个域对数据记录进行排序,也可以用-k选项指定某个域进行排序。sort命令用1表示第1个域,用2表示第2个域,以此类推。
2、指定排序
a.不指定排序要求
cat filename |sort
sort filename
两种写法功能相同,效果一样。
b.按数值排序
在前面简单应用的基础上,加上选项-n。
cat filename |sort -n
sort -n filename
c.按中文拼音排序
bash仅支持按拼音对中文排序,不能按笔画排序。
其他软件可以支持中文按笔画排序,但需下载安装。
d.按指定分隔符指定域排序
这类排序应用比较多,也是最复杂的情况。主要是在sort命令中添加-t和-k选项。
3、反向排序
sort 的-r选项,是按照倒序输出,最终效果是倒序排序。
原理在于:先按要求排序,再反向输出!
虽然选项可以调整位置,写在前写在后,连接写,单独写,均可。但排序原则是:
-r 先默认排序,再反向输出
-nr 先按数字排序再反向输出
注意:"-r"不参与排序动作,只是操作排序完成后的结果
4、多列排序
一个文本文件是按行分隔,有多项记录。而每行又可以按指定分隔符分隔成多个域(有时称为字段、列)。多列排序主要是应用sort的-t选项和-k选项。
-t指定分隔符(或称间隔符)
默认分隔符是空格。可以通过-t":"指定其他分隔符。-t与":"之间可有可无空格;分隔符可加可不加""(当然也可用单引号''或不用'')。
常用分隔符有空格" "、冒号":"、分号";"、@#$\等等。
对于特殊符号(如制表符),可使用类似于-t $'\t'或-t 'ctrl+v,tab'(先按ctrl+v,然后按tab键)的方法实现。
-k用来指定列数
-k 选项的语法如下:
[FStart[.CStart]][Modifier][,[FEnd[.CEnd]][Modifier]]
这个语法格式包含两大部分,以逗号(,)分割为Start和End两部分;如果不设置End部分,那么就认为End被设定为行尾!
Start部分由三部分组成:
FStart指定以哪个部分排序,1就是以第一部分排序
CStart指定从指定部分的第几个字符开始排序
Modifier指定排序方式可以使用r、n等选项
5.其他排序功能
a.去重
sort的-u选项
-u的作用就是在输出行中去重复
b.忽略大小写
sort常用选项
-f会将小写字母都转换为大写字母来进行比较,亦即忽略大小写
c.检查文件与合并文件
-c会检查文件是否已排好序,如果乱序,则输出第一个乱序的行的相关信息,最后返回1
-C会检查文件是否已排好序,如果乱序,不输出内容,仅返回1
-m 合并已排序的多个文件为一个文件
d.修改原文件
sort的-o选项
正常将sort的执行结果重定向到源文件会使源文件变为空。
但是加上-o就可以将排序后的结果重定向到源文件
三、实训案例
1. 不加任何选项排序
先准备训练素材:(各字符间用空格分隔)
cat sort1.txt
xiaoli 25 2388
wangyuan 20 2388
xiaozi 25 3406
xiaohong 25 2387
xiaozi 25 3407
zhangyishan 24 5678
wangyuan 20 2386
guosan 25 3409
liyang 25 2385
wangyuan 20 2389
guosan 25 3405
liyang 25 2382
chensan 25 3402
liyang 25 2381
chensan 25 3404
执行sort命令:
sort sort1.txt
由结果可知,排序结果按第一列进行升序排列。
2. 按第2列数值降序排序
选项-k2nr 其中k按指定列(域)排序,2指第2列,n指按数据排序,r指反向显示。
不设置分隔符,是按默认分隔符(空格)。
3.指定分隔符再排序
先准备以制表符分隔的文本素材sort2.txt
修改sort1.txt:sed 's/ /\t/g' sort1.txt >sort2.txt
查看一下修改效果:
指定制表符这种无法直接输入的特殊字符的方式是$'\t'。
4.多列排序与多项排序
编辑以分隔符.分隔的文本素材sort3.txt
192.168.3.1 00:0F:AF:81:19:1F
192.168.3.2 00:0F:AF:85:6C:25
192.168.3.3 00:0F:AF:85:70:42
192.168.2.20 00:0F:AF:85:55:DE
192.168.2.21 00:0F:AF:85:6C:09
192.168.2.22 00:0F:AF:85:5C:41
192.168.0.151 00:0F:AF:85:6C:F6
192.168.0.152 00:0F:AF:83:1F:65
192.168.0.153 00:0F:AF:85:70:03
192.168.1.10 00:30:15:A2:3B:B6
192.168.1.11 00:30:15:A3:23:B7
192.168.1.12 00:30:15:A2:3A:A1
192.168.1.1 00:0F:AF:81:19:1F
192.168.2.2 00:0F:AF:85:6C:25
192.168.3.3 00:0F:AF:85:70:42
192.168.2.22 00:0F:AF:85:5C:41
192.168.1.152 00:0F:AF:83:1F:65
192.168.0.153 CA:0F:AF:85:70:03
192.168.3.10 00:30:15:A2:3B:B6
192.168.1.11 00:30:15:A3:23:B7
192.168.3.12 00:30:15:A2:3A:A1
案例目标:按网段降序排序,相同时再按IP第4位升序排序。
分析素材:每行由几部分组成:前几位是IP地址,后面几位是MAC地址。
IP地址由.分隔四位数字,MAC地址由:分隔六位十六制数字,IP地址与MAC地址由空格分隔。
本案例设置-t.分隔符,对第3列和第4列分别排序。
按数值排序,用-n选项;降序用-r选项。进行两项排序时,可以设置两个-k选项,分别设置排序选项。
sort -n -t. -k3,3r -k4,4.3 sort3.txt
sort -n -u -t. -k3.3r -k4.1,4.3 sort3.txt
-k3,3从第三个字段开始排序,到第三个字段结束。
-k4,4.3从第四个字段的第一个字符开始排序,到第四个字段的第三个字符结束。
重点理解:逗点.后面紧跟的数字,在其中的这个含义:从逗点.前面数字所在域的第几个字符,开始。
-k 3.3 意思就是,从第3个域的第三个字符开始;同理 -k 4.1 就是从第4个域的第一个字符开始。
总结说明:
.是某个段的第几个字符。
,号前面默认是第一个字符,后面默认是到结尾,“,”是分隔字段的。
5.特殊事项
a.-t分隔符不能设置多个分隔符,就是一会只能设置一个分隔符。不象其他命令,如awk,可以设置多个分隔符。
b.如果文本文件中,空格处有多个空格,会影响-t的作用。需要提前处理。或者用tr –s ' ',或者用-b选项。
小结
sort命令是Linux系统一种排序工具,它将输入文件看作由多条记录组成的数据流,而记录由可变宽度的字段组成,以换行符为定界符。sort命令与awk类似,可将记录分成多个域来处理,默认的域分隔符是空格符,域分隔符也可由用户指定。
主要了解:sort命令的-r -f选项
重点掌握:-t -n -o -u - k,尤其是-k。