sort命令选项很长,下面仅介绍各种选项。
sort命令的一般格式为:
sort -cmu -o output_file [other options] +pos1 +pos2 input_files
下面简要介绍一下sort的参数:
-c 测试文件是否已经分类。
-m 合并两个分类文件。
-u 删除所有复制行。
-o 存储s o r t结果的输出文件名。
其他选项有:
-b 使用域进行分类时,忽略第一个空格。
-n 指定分类是域上的数字分类。
-t 域分隔符;用非空格或t a b键分隔域。
-r 对分类次序或比较求逆。
+n n为域号。使用此域号开始分类。
n n为域号。在分类比较时忽略此域,一般与+n一起使用。
post1 传递到m,n。m为域号,n为开始分类字符数;例如4,6意即以第5域分类,从第7个字符开始。
保存输出
- o选项保存分类结果,然而也可以使用重定向方法保存。下面例子保存结果到results.out:
$sort video >results.out
2.例子说明
=========================================
下面是文件video的清单,包含了上个季度家电商场的租金情况。各域为:
(1)名称,(2)供货区代码,(3)本季度租金,(4)本年租金。
域分隔符为冒号,为此对此例需使用‘-t’选项。文件如下:
[root@Linuxsvr lab]# cat video
Boys in Company C
Alien
The Hill
Aliens
Star Wars
A Few Good Men :KL
Toy Story
=========================================
3.启动方式
缺省情况下,sort认为“一个空格”或“一系列空格”为“分隔符”。要加入其他方式分隔,使用-t(-t+分隔符)选项,如:
[root@Linuxsvr lab]# sort -t: video
A Few Good Men
Alien
Aliens
Boys in Company C
Star Wars
The Hill
Toy Story
以“:”为分隔符,按照第一列排序
4.
先查看是否为域分隔设置了- t选项,如果设置了- t选项,则使用分隔符将记录分隔成 域0、域1、域2、域3等等;
如果未设置- t选项,用空格代替。
缺省时sort以每行第一个字符将整个行排序,也可以指定域号,这样就会按照指定的域优先进行排序,
如果指定的域有重复,会参考下一个域。
sort对域的参照方式:
关于sort的一个重要事实是它参照第一个域作为域0,域1是第二个域,等等。sort也可以使用整行作为分类依据。
=========================================
第一个域
域0
Boys in Company C
Alien
The Hill
Aliens
Star Wars
A Few Good Men
Toy Story
=========================================
文件是否已分类
怎样分辨文件是否已分类?如果只有30行,看看就知道了,但如果是400行呢,使用sort -c查看sort文件是否按某种顺序分类。
[root@Linuxsvr lab]# sort -c video
sort: video:2: disorder: Alien
结果显示未分类,现在将video分类,并存为2.video
[root@Linuxsvr lab]# sort -t: video >2.video
[root@Linuxsvr lab]# sort -c 2.video
[root@Linuxsvr lab]#
没有任何错误提示,返回提示符表明已分类。然而如果测试成功,返回一个信息行会更好。
5.
基本sort
最基本的sort方式为sort filename,按第一域进行分类(分类键0)。实际上读文件时sort操作将行中各域进行比较,
这里返回基于第一域sort的结果
[root@Linuxsvr lab]# sort -t: video
A Few Good Men
Alien
Aliens
Boys in Company C
Star Wars
The Hill
Toy Story
sort分类求逆
如果要逆向sort结果,使用- r选项。在通读大的注册文件时,使用逆向sort很方便。下面是按域0分类的逆向结果。
[root@Linuxsvr lab]# sort -t: -r video
Toy Story
The Hill
Star Wars
Boys in Company C
Aliens
Alien
A Few Good Men
按指定域分类
有时需要只按第2域(分类键1)分类。这里为重排 报文中“供应区代码”,使用t 1,意义为按分类键1分类。
下面的例子中,所有供应区代码按分类键1分类;
注意分类键2和3对应各域也被分类。因为第2域有重复,sort会再重复的情况下优先考虑下一个域的顺序。而且是按照第一个字符分类,并不是
按照整个数值大小分类63小于445,却被排到后面,因为第一个字符是6,大于4。
[root@Linuxsvr lab]# sort -t: +1 video
Alien
Boys in Company C
Toy Story
Star Wars
Aliens
A Few Good Men
The Hill
数值域分类
依此类推,要按第三域(第二分类键)分类,使用t 2。但是因为这是数值域,即为数值分类,可以使用- n选项。下面例子为按季度租金分类命
令及结果:
[root@Linuxsvr lab]# sort -t: +2n video
The Hill
Alien
Boys in Company C
Toy Story
Star Wars
A Few Good Men
Aliens
使用-n选项是按照数值大小进行排列的,不使用-n选项是按照数字位排列,先看最左边第一位大小,如果第一位相同再看第二位大小
如果不指定n,如下
[root@Linuxsvr lab]# sort -t: +2 video
Alien
Boys in Company C
Toy Story
Star Wars
A Few Good Men
Aliens
The Hill
数值域倒序:
[root@Linuxsvr lab]# sort -t: +2nr video
Aliens
A Few Good Men
Star Wars
Toy Story
Boys in Company C
Alien
The Hill
唯一性分类
有时,原文件中有重复行,这时可以使用- u选项进行唯一性(不重复)分类以去除重复行,下例中A l i e n有相同的两行。带重复行的文件
如下,其中A l i e n插入了两次:
[root@Linuxsvr lab]# cat video
Boys in Company C
Alien
The Hill
Aliens
Star Wars
A Few Good Men
Toy Story
Aliens
使用- u选项去除重复行,不必加其他选项, sort会自动处理。
[root@Linuxsvr lab]# sort -u video
A Few Good Men
Alien
Aliens
Boys in Company C
Star Wars
The Hill
Toy Story
[root@Linuxsvr lab]# sort video
A Few Good Men
Alien
Aliens
Aliens
Boys in Company C
Star Wars
The Hill
Toy Story
使用k的其他sort方法
sort还有另外一些方法指定分类键。可以指定k选项,第1域(分类键)以1开始。不要与前面相混淆。其他选项也可以使用k,主要用于指定分
类域开始的字符数目。格式:
-k
The keydef argument is a restricted sort key field
[root@Linuxsvr lab]# sort -t: -k[field_start[type][,field_end[type]]] video
[root@Linuxsvr lab]# sort -t: -k2,2 -k1,1 video
Alien
Aliens
Aliens
Boys in Company C
Star Wars
Toy Story
A Few Good Men
The Hill
如果不指定结束域,分类将会按照后面的域以次排序。如果上面的例子不指定-k2,2后面结束域,结果如下:
[root@Linuxsvr lab]# sort -t: -k2 -k1,1 video
Alien
Boys in Company C
Toy Story
Star Wars
Aliens
Aliens
A Few Good Men
The Hill
上面的例子不会再以第一域排序,而是按照第二域排序,如果第二域有重复,优先考虑第三域,如果再有重复,考虑第四域,而不是第一域。
用k做分类键排序
可以指定分类键次序。再全部将结果反向排序,方法如下:
[root@Linuxsvr lab]# sort -t: -k2,2 -k1,1 -r video
The Hill
A Few Good Men
Toy Story
Star Wars
Boys in Company C
Aliens
Aliens
Alien
[root@Linuxsvr lab]# sort -t: -k2,2 -k1,1 video
Alien
Aliens
Aliens
Boys in Company C
Star Wars
Toy Story
A Few Good Men
The Hill
下面的例子把Aliens改为Bliens,先对第三域反向排序,重复的地方再按照第一域正向排。
[root@Linuxsvr lab]# sort -t: +2nr -k1,1 video
Aliens
Bliens
A Few Good Men
Star Wars
Toy Story
Boys in Company C
Alien
The Hill
下面例子是先对第三域 正向排,重复的地方再按照第一域反向排
[root@Linuxsvr lab]# sort -t: +2n -k1,1 -r video
The Hill
Alien
Boys in Company C
Toy Story
Star Wars
A Few Good Men
Bliens
Aliens
27 90 1281865143
27 9 1565288011
27 9 1564555610
27 9 1563708615
27 9 1563480633
27 9 1562972964
27 9 1562516991
27 9 1561724052
27 9 1548140260
27 9 1363438891
27 90 1281865143
27 89 1558144014
27 68 1558790737
27 62 1557561813
27 59 1562208594
27 57 1536871012
27 42 1547831844
27 42 1072496911
27 37 1559260203
27 37 1249959734
/********************************************************************************************************/
/********************************************************************************************************/
/********************************************************************************************************/
$ cat names.txt
Emma Thomas:100:Marketing
Alex Jason:200:Sales
Madison Randy:300:Product Development
Sanjay Gupta:400:Support
Nisha Singh:500:Sales
1) 以升序对文本排序
$ sort names.txt
Alex Jason:200:Sales
Emma Thomas:100:Marketing
Madison Randy:300:Product Development
Nisha Singh:500:Sales
Sanjay Gupta:400:Support
2) 以降序对文本排序
$ sort -r names.txt
Sanjay Gupta:400:Support
Nisha Singh:500:Sales
Madison Randy:300:Product Development
Emma Thomas:100:Marketing
Alex Jason:200:Sales
3) 对一个使用冒号分隔的文件的第二项进行排序(也就是 employee_id)
$ sort -t: -k 2 names.txt
Emma Thomas:100:Marketing
Alex Jason:200:Sales
Madison Randy:300:Product Development
Sanjay Gupta:400:Support
Nisha Singh:500:Sales
4) 使用 tab分隔的第三项进行排序(department_id),并去掉重复项
$ sort -t: -u -k 3 names.txt
Emma Thomas:100:Marketing
Madison Randy:300:Product Development
Alex Jason:200:Sales
Sanjay Gupta:400:Support
5) passwd文件的第三项进行排序(userid)
$ sort -t: -k 3n /etc/passwd | more
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6) 基于ip地址对/etc/hosts文件排序
$ sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n /etc/hosts
127.0.0.1 localhost.localdomain localhost
192.168.100.101 dev-db.thegeekstuff.com dev-db
192.168.100.102 prod-db.thegeekstuff.com prod-db
192.168.101.20 dev-web.thegeekstuff.com dev-web
192.168.101.21 prod-web.thegeekstuff.com prod-web
7) 与其它命令组合在一起使用
ps -ef | sort 对进程列表进行排序
ls -al | sort +4n 使用升序对 ls -al 的输出以文件大小进行排序(第 5 项)
ls -al | sort +4nr 使用降序对 ls -al 的输出以文件大小进行排序(第 5 项)