sort命令的功能是对文件中的各行进行排序。sort命令有许多非常实用的选项,这些选项最初是用来对数据库格式的文件内容进行各种排序操作的。实际上,sort命令可以被认为是一个非常强大的数据管理工具,用来管理内容类似数据库记录的文件。
sort排序是根据从输入行抽取的一个或多个关键字进行比较来完成的。排序关键字定义了用来排序的最小的字符序列。
在各类编程语言中,排序是一项避不开的话题。可以说都有sort这项操作、功能或命令。
linux生产环境中,sort命令常用于对统计日志中不同服务错误的数量进行排序。
一、sort的工作原理
sort将文件的每一行作为一个单位,相互比较,默认比较规则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。
sort命令将逐行对文件中的内容进行排序,如果两行的首字符相同,该命令将继续比较这两行的下一字符,如果还相同,将继续进行比较。
更多情况下,sort读取每一行后按照指定的分隔符将每一行划分成多个字段,这些字段就是sort排序的对象。同时,sort可以指定按照何种排序规则进行排序,如按照当前字符集排序规则(这是默认排序规则)、按照字典排序规则、按照数值排序规则、按照月份排序规则、按照文件大小格式(k<M<G)。还可以去除重复行,指定降序或升序(默认)的排序方式。
默认的排序规则为字符集排序规则,通常几种常见字符的顺序为:"空字符串<空白字符<数值<a<A<b<B<...<z<Z",字典排序规则也如此。
语法:
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。