日志分析统计sort与uniq命令详解

Linux-Log-SortUniq

一、sort命令:排序工具

1. 基本功能

  • 作用:对文件内容或命令结果进行排序。
  • 常用选项
    • -n:按数字大小排序(默认按字符排序)。
    • -r:逆序排序(从大到小)。
    • -k:指定排序的列(如-k2表示按第2列排序)。
    • -t:指定分隔符(如-t':'表示以冒号分隔列)。

2. 核心案例

生成测试文件

1
2
3
4
5
6
7
8
9
10
vim file.txt
99
1
10
23
3
0000
02
9
19

案例1:基本数字排序

sort默认是按照字母/字符进行对比,会造成数字对比失败!

解决 -n

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 按字符排序(默认)
sort file.txt
0000
02
1
10
19
23
3
9
99

# 按数字排序
sort -n file.txt
0000
1
02
3
9
10
19
23
99

# 逆序数字排序
sort -nr file.txt
99
23
19
10
9
3
02
1
0000

案例2:按指定列排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 生成测试文件
vim file.txt
99 19
1 9
10 02
23 0000
3 3
0000 23
02 10
9 1
19 99

# 按第2列数字排序
sort -nk2 file.txt
23 0000
9 1
10 02
3 3
1 9
02 10
99 19
0000 23
19 99

# 按第2列逆序排序
sort -nrk2 file.txt
19 99
0000 23
99 19
02 10
1 9
3 3
10 02
9 1
23 0000

案例3:多列排序

-nk1 -nk2 的执行逻辑

  • 首先按第一列(k1)数值排序-n)。
  • 仅当第一列的值相同时,才会按第二列(k2)数值排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 生成测试文件
vim file2.txt
3 300
1 100
2 200
3 30
1 10
2 20

# 先按第1列排序,再按第2列排序
sort -nk1 -nk2 file2.txt
1 10 # 第一列=1,第二列升序
1 100
2 20 # 第一列=2,第二列升序
2 200
3 30 # 第一列=3,第二列升序
3 300

案例4:指定分隔符排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 以冒号为分隔符,按第3列逆序排序
sort -t':' -nrk3 /etc/passwd
xiao:x:1000:1000:xiao:/home/xiao:/bin/bash
polkitd:x:999:997:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/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
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

3. 企业面试题

题目:从ls /etc/输出中取出文件大小最大的前5个文件。
解答

1
2
3
4
5
6
ls -l /etc/ | sort -nrk5 | head -5
-rw-r--r--. 1 root root 670293 6月 7 2013 services
-rw-r--r--. 1 root root 19138 4月 3 15:50 ld.so.cache
-rw-r--r--. 1 root root 12288 4月 3 15:48 aliases.db
-rw-r--r--. 1 root root 7274 4月 3 15:48 kdump.conf
-rw-r--r--. 1 root root 6545 4月 1 2020 protocols

二、uniq命令:去重与统计

1. 基本功能

  • 作用:去除相邻的重复行,并可统计重复次数。
  • 常用选项
    • -c:统计每行出现的次数。

    • uniq -c 的默认格式是:

      1
      [出现次数] [原行内容]

2. 核心案例

案例1:去重并统计次数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 先排序使相同行相邻,再去重统计
sort file2.txt | uniq -c
1 1 10
1 1 100
1 2 20
1 2 200
1 3 30
1 3 300

# 按出现次数逆序排序
sort file2.txt | uniq -c | sort -nr
1 3 300
1 3 30
1 2 200
1 2 20
1 1 100
1 1 10

案例2:日志分析实战

需求:统计日志文件中每个IP出现的次数,取前2名。
解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 生成测试文件
# grep -oE '\b([0-9]{1,3}\.){3}[0-9]{1,3}\b' /var/log/secure > secure-ip.txt
# cat secure-ip.txt
0.0.0.0
192.168.184.1
0.0.0.0
0.0.0.0
192.168.184.1
0.0.0.0
192.168.184.1
0.0.0.0
192.168.184.1
192.168.184.1
192.168.184.1

sort secure-ip.txt | uniq -c | sort -nr | head -2
6 192.168.184.1
5 0.0.0.0

三、sort与uniq组合应用

  • 典型流程
    sortuniq -csort -nrhead
  • 适用场景
    日志分析、数据统计、系统信息整理等。

四、总结

  • sort:排序工具,支持多列、数字、逆序、分隔符等功能。
  • uniq:去重工具,需与sort配合使用。
  • 组合命令sort | uniq -c | sort -nr是日志分析的黄金组合。