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