十二.   行的排序命令sort:

  1.  sort命令行选项:

选项

描述

-t

字段之间的分隔符

-f

基于字符排序时忽略大小写

-k

定义排序的域字段,或者是基于域字段的部分数据进行排序

-m

将已排序的输入文件,合并为一个排序后的输出数据流

-n

以整数类型比较字段

-o outfile

将输出写到指定的文件

-r

倒置排序的顺序为由大到小,正常排序为由小到大

-u

只有唯一的记录,丢弃所有具有相同键值的记录

-b

忽略前面的空格

   2.  sort使用实例:
    提示:在下面的输出结果中红色标注的为第一排序字段,后面的依次为紫、绿。
    /> sed -n '1,5p' /etc/passwd > users
    /> cat users
    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
    #-t
定义了冒号为域字段之间的分隔符,-k 2指定基于第二个字段正向排序(字段顺序从1开始)
    /> sort -t':' -k 1 users
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    root:x:0:0:root:/root:/bin/bash
    #
还是以冒号为分隔符,这次是基于第三个域字段进行倒置排序。
    /> sort -t':' -k 3r users
    lp:x:
4:7:lp:/var/spool/lpd:/sbin/nologin
    adm:x:
3:4:adm:/var/adm:/sbin/nologin
    daemon:x:
2:2:daemon:/sbin:/sbin/nologin
    bin:x:1:
1:bin:/bin:/sbin/nologin
    root:x:
0:0:root:/root:/bin/bash
    #
先以第六个域的第2个字符到第4个字符进行正向排序,在基于第一个域进行反向排序。
    /> sort -t':' -k 6.2,6.4 -k 1r users
    bin:x:1:1:bin:/bin:/sbin/nologin
    root:x:0:0:root:/root:/bin/bash
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    #
先以第六个域的第2个字符到第4个字符进行正向排序,在基于第一个域进行正向排序。和上一个例子比,第4和第5行交换了位置。
    /> sort -t':' -k 6.2,6.4 -k 1 users
    bin:x:1:1:bin:/bin:/sbin/nologin
    root:x:0:0:root:/root:/bin/bash
    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
    #
基于第一个域的第2个字符排序
    /> sort -t':' -k 1.2,1.2 users    
    d
aemon:x:2:2:daemon:/sbin:/sbin/nologin
    a
dm:x:3:4:adm:/var/adm:/sbin/nologin
    b
in:x:1:1:bin:/bin:/sbin/nologin
    r
oot:x:0:0:root:/root:/bin/bash
    l
p:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    #
基于第六个域的第2个字符到第4个字符进行正向排序,-u命令要求在排序时删除键值重复的行。
    /> sort -t':' -k 6.2,6.4 -u users
    bin:x:1:1:bin:/
bin:/sbin/nologin
    root:x:0:0:root:/
root:/bin/bash
    daemon:x:2:2:daemon:/
sbin:/sbin/nologin
    adm:x:3:4:adm:/
var/adm:/sbin/nologin
    /> cat /etc/passwd | wc -l  #计算该文件中文本的行数。
    39
    /> sed -n '35,$p' /etc/passwd > users2  #取最后5行并输出到users2中。
    /> cat users2
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/bash
    pulse:x:496:494:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
    gdm:x:42:42::/var/lib/gdm:/sbin/nologin
    stephen:x:500:500:stephen:/home/stephen:/bin/bash
    #
基于第3个域字段以文本的形式排序
    /> sort -t':' -k 3 users2
    mysql:x:
27:27:MySQL Server:/var/lib/mysql:/bin/bash
    gdm:x:
42:42::/var/lib/gdm:/sbin/nologin
    pulse:x:
496:494:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
    stephen:x:
500:500:stephen:/home/stephen:/bin/bash
    sshd:x:74:
74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    #
基于第3个域字段以数字的形式排序
    /> sort -t':' -k 3n users2
    mysql:x:
27:27:MySQL Server:/var/lib/mysql:/bin/bash
    gdm:x:
42:42::/var/lib/gdm:/sbin/nologin
    sshd:x:
74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    pulse:x:
496:494:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
    stephen:x:
500:500:stephen:/home/stephen:/bin/bash
    #
基于当前系统执行进程的owner名排序,并将排序的结果写入到result文件中
    /> ps -ef | sort -k 1 -o result
十三. 删除重复行的命令uniq:
    uniq
3个最为常用的选项,见如下列表:

选项

命令描述

-c

可在每个输出行之前加上该行重复的次数

-d

仅显示重复的行

-u

显示为重复的行

    /> cat testfile

    hello
    world
    friend
    hello
    world
    hello
    #直接删除未经排序的文件,将会发现没有任何行被删除
    /> uniq testfile  
    hello
    world
    friend
    hello
    world
    hello
    #
排序之后删除了重复行,同时在行首位置输出该行重复的次数
    /> sort testfile | uniq -c  
    1 friend
    3 hello
    2 world
    #
仅显示存在重复的行,并在行首显示该行重复的次数
    /> sort testfile | uniq -dc
    3 hello
    2 world
    #
仅显示没有重复的行
    /> sort testfile | uniq -u
    friend