1.语法


语法:

  排序,影响输出次序,不会改变原文件内容。默认按照 ASCII 表顺序进行排序。默认情况下,空格作为字段分隔符。

  sort命令有三种工作模式:排序(默认)、合并、检查排序状态。


选项:

  


选项
说明
-c
测试文件是否已经排序;有输出、有返回值(没有排序,返回1)
-C
无输出,仅返回(0已排序、1未排序)
-m


“排序选项”列表
选项 说明

-b

比较时使用第一个非空字符
-d

字典排序

排序时,忽略数字、字母、空格之外的其他字符,……

-f
把小写字母变成大写
-M
排序月份(jan、feb……dec)
-h
人性化显示(e.g., 2K 1G)
-n
按字串的数值序列排序
-r
降序排列(默认,升序)
-V
自然顺序(不是完全按照ascii表.,字母按其拍完,特殊字符继续按其排)
“其他选项”列表
选项
说明
-k 定义排序关键字”
-o
排序结果写入文件
-t
指定列分隔符(字段分割符,默认:空白符)
-u
删除重复的行



2.实例


2.1.排序列

  先看难以理解的k,简单用法如下:

效果很明显
[view@tri ~]$ sort -k 1 sort.txt
a 9
d    3
x   5
[view@tri ~]$ sort -k 2 sort.txt
d    3
x   5
a 9


  k的语法格式:F[.C][OPTS][,F[.C][OPTS]]

  看起来蛮复杂,还是有规律可循,逗号前后有两部分,这么一看语法含义很明显了。F.C表示某列起始到某个字符位置(均从1开始算起首个非空白符),OPTS为一个或多个序列选项(bdfgiMhnRrV)。不使用k选项,默认k为整行。

第二列,数字降序
[view@tri ~]$ sort -k 2nr sort.txt
ntp      24831  0.0  0.1  29420  2012 ?        Ss   Aug24   0:04 /usr/sbin/ntpd -u ntp:ntp -g
root     24490  0.0  0.3 105480  3760 ?        Ss   Aug24   0:00 /usr/sbin/sshd -D
polkitd  24411  0.0  1.1 527516 11776 ?        Ssl  Aug24   0:02 /usr/lib/polkit-1/polkitd --no-debug
work     22107  0.0  0.1 151056  1832 pts/0    R+   12:39   0:00 ps aux
work     21572  0.0  0.2 115516  2228 pts/1    Ss+  10:44   0:00 -bash
root      9764  0.0  0.1  74488  1592 ?        Ss   Aug22   0:32 /usr/local/httpd-2.4.6/bin/httpd -k start
apache    1382  0.0  0.2  74624  2488 ?        S    Aug25   0:00 /usr/local/httpd-2.4.6/bin/httpd -k start
root       465  0.0  0.0  23768   704 ?        Ss   Jun30   0:00 /usr/sbin/atd -f
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

第二列,降序(默认从列的首个非空字符ascii升序排列)
[view@tri ~]$ sort -k 2r sort.txt
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root      9764  0.0  0.1  74488  1592 ?        Ss   Aug22   0:32 /usr/local/httpd-2.4.6/bin/httpd -k start
root       465  0.0  0.0  23768   704 ?        Ss   Jun30   0:00 /usr/sbin/atd -f
ntp      24831  0.0  0.1  29420  2012 ?        Ss   Aug24   0:04 /usr/sbin/ntpd -u ntp:ntp -g
root     24490  0.0  0.3 105480  3760 ?        Ss   Aug24   0:00 /usr/sbin/sshd -D
polkitd  24411  0.0  1.1 527516 11776 ?        Ssl  Aug24   0:02 /usr/lib/polkit-1/polkitd --no-debug
work     22107  0.0  0.1 151056  1832 pts/0    R+   12:39   0:00 ps aux
work     21572  0.0  0.2 115516  2228 pts/1    Ss+  10:44   0:00 -bash
apache    1382  0.0  0.2  74624  2488 ?        S    Aug25   0:00 /usr/local/httpd-2.4.6/bin/httpd -k start

按照日期排序(升序)
[view@tri ~]$ sort -k 9M sort.txt
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
work     21572  0.0  0.2 115516  2228 pts/1    Ss+  10:44   0:00 -bash
work     22107  0.0  0.1 151056  1832 pts/0    R+   12:39   0:00 ps aux
root       465  0.0  0.0  23768   704 ?        Ss   Jun30   0:00 /usr/sbin/atd -f
apache    1382  0.0  0.2  74624  2488 ?        S    Aug25   0:00 /usr/local/httpd-2.4.6/bin/httpd -k start
ntp      24831  0.0  0.1  29420  2012 ?        Ss   Aug24   0:04 /usr/sbin/ntpd -u ntp:ntp -g
polkitd  24411  0.0  1.1 527516 11776 ?        Ssl  Aug24   0:02 /usr/lib/polkit-1/polkitd --no-debug
root     24490  0.0  0.3 105480  3760 ?        Ss   Aug24   0:00 /usr/sbin/sshd -D
root      9764  0.0  0.1  74488  1592 ?        Ss   Aug22   0:32 /usr/local/httpd-2.4.6/bin/httpd -k start


2.2.列分割标记

  以冒号为分隔符,对第2列降序排列

[view@tri ~]$ sort -t: -rnk 2 sort.txt
1.32:    21:    2:8453434k
0.22:    20:    2:64543543k
0.98:    14:    1:54355k


2.3.排序

  判断给定文件,是否已经排序。排序后的文件返回值,为0。

首列是排过序的,返回应该是0
[view@tri ~]$ sort -c sort.txt
[work@tri ~]$ echo $?
0
[work@tri ~]$ sort -C sort.txt
[work@tri ~]$ echo $?
0
第二列,是没有排序的,返回是1
[work@tri ~]$ sort -c -k 2 sort.txt
sort: sort.txt:3: disorder: 5 2
[work@tri ~]$ echo $?
1
[work@tri ~]$ sort -C -k 2 sort.txt
[work@tri ~]$ echo $?
1


  排序时,重复行、大小写的问题

u选项排除相同行
[work@tri ~]$ sort sort.txt -u
hello
Hello
f选项认为小写字母等于大写字母(ASCII)
[work@tri ~]$ sort sort.txt -fu
Hello


2.4.合并

  合并两个相同格式不同内容的文件

$ sort access-2015*.log
$ sort -u access-2015*.log > access-2015.log


  合并两个相同格式不同内容的文件

[view@tri ~]$ sort sort.txt
0.22
0.22
0.98
0.98
0.98
1.32
1.32
[view@tri ~]$ sort -u  sort.txt
0.22
0.98
1.32