sort与uniq命令

1.sort

sort 命令对 File 参数指定的文件中的行排序,并将结果写到标准输出。

如果 File 参数指定多个文件,那么 sort 命令将这些文件连接起来,并当作一个文件进行排序。

1.1语法

sort [-fbMnrtuk] [file or stdin]
选项与参数:
-f :忽略大小写的差异,例如 A 与 a 视为编码相同;
-b :忽略最前面的空格符部分;
-M :以月份的名字来排序,例如 JAN, DEC 等等的排序方法;
-n :使用『纯数字』进行排序(默认是以文字型态来排序的);
-r :反向排序;
-u :就是 uniq ,相同的数据中,仅出现一行代表;
-t :分隔符,默认是用 [tab] 键来分隔;
-k :以那个区间 (field) 来进行排序的意思

1.2sort实例

1.2.1对/etc/passwd 的账号进行排序

[root@localhost ~]# sort /etc/passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
elasticsearch:x:997:995:elasticsearch user:/nonexistent:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
kibana:x:996:994:kibana service user:/home/kibana:/sbin/nologin
logstash:x:995:993:logstash:/usr/share/logstash:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
mysql:x:1000:1000::/home/mysql:/sbin/nologin
named:x:25:25:Named:/var/named:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

sort 是默认以第一个数据来排序,而且默认是以字符串形式来排序,所以由字母 a 开始升序排序。

1.2.2/etc/passwd 内容是以 : 来分隔的,以第三栏来排序

默认是以字符串来排序的,第三列为数字:

[root@localhost ~]# cat /etc/passwd |sort -t ':' -k 3n
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
named:x:25:25:Named:/var/named:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
logstash:x:995:993:logstash:/usr/share/logstash:/sbin/nologin
kibana:x:996:994:kibana service user:/home/kibana:/sbin/nologin
elasticsearch:x:997:995:elasticsearch user:/nonexistent:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
mysql:x:1000:1000::/home/mysql:/sbin/nologin

sort默认是升序排序,如果要倒序排序,如下

[root@localhost ~]# cat /etc/passwd |sort -t ':' -k 3nr
mysql:x:1000:1000::/home/mysql:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
elasticsearch:x:997:995:elasticsearch user:/nonexistent:/sbin/nologin
kibana:x:996:994:kibana service user:/home/kibana:/sbin/nologin
logstash:x:995:993:logstash:/usr/share/logstash:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
named:x:25:25:Named:/var/named:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sync:x:5:0:sync:/sbin:/bin/sync
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

1.2.3如果要对/etc/passwd,先以第6列的第2个字符到第4个字符进行正向排序,再基于第一个域进行反向排序。

[root@localhost ~]# cat /etc/passwd |sort -t':' -k 6.2,6.4 -k 1r   
bin:x:1:1:bin:/bin:/sbin/nologin
mysql:x:1000:1000::/home/mysql:/sbin/nologin
kibana:x:996:994:kibana service user:/home/kibana:/sbin/nologin
elasticsearch:x:997:995:elasticsearch user:/nonexistent:/sbin/nologin
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
daemon:x:2:2:daemon:/sbin:/sbin/nologin
logstash:x:995:993:logstash:/usr/share/logstash:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
named:x:25:25:Named:/var/named:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

1.2.4查看/etc/passwd有多少个shell:对/etc/passwd的第七个域进行排序,然后去重

[root@localhost ~]# cat /etc/passwd |sort -t':' -k 7 -u
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
halt:x:7:0:halt:/sbin:/sbin/halt
bin:x:1:1:bin:/bin:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

2.uniq

uniq命令可以去除排序过的文件中的重复行

因此uniq经常和sort合用。也就是说,为了使uniq起作用,所有的重复行必须是相邻的

2.1uniq语法

uniq [-icu]
选项与参数:
-i :忽略大小写字符的不同;
-c :进行计数
-u :只显示唯一的行

2.2uniq实例

2.2.1直接去重未经排序的文件,将会发现没有任何行被去掉

[root@localhost ~]# cat test
hello
world
ni
hao
hello
world
hao
hello
hao
[root@localhost ~]# uniq test
hello
world
ni
hao
hello
world
hao
hello
hao

先排序文件,再去重

[root@localhost ~]# cat test|sort|uniq
hao
hello
ni
world

在行首位置输出该行重复的次数

[root@localhost ~]# cat test|sort|uniq -c
      3 hao
      3 hello
      1 ni
      2 world

2.2.2仅显示存在重复的行,并在行首显示该行重复的次数

[root@localhost ~]# cat test|sort|uniq -dc
      3 hao
      3 hello
      2 world

2.2.3仅显示不重复的行

[root@localhost ~]# cat test|sort|uniq -u
ni

3.高级用法

cat log |awk -F'|' '{print $3}'|sort|uniq -c|sort -nr|head -5

"""
1. 查看log
2. 使用awk工具, 指定分隔符为'|', 输出第三段
3. <2>作为sort的输出进行排序
4. <3>作为uniq的输入进行去重, -c参数显示重复数量
5. <4>作为sort的输入进行排序, -nr指定按照重复数量进行排序, 并且反序
6. <5>作为head的输入, 输出前5条数据
原文地址:https://www.cnblogs.com/liping0826/p/13229165.html