linux shell小试牛刀之一——统计服务器上的网络连接数

今天发现一台linux服务器上的网络连接数比较多,使用ss -s看一下,发现有差不多存在2000个连接,接下来我会通过管道并组合使用多个linux命令,统计一下哪些哪些ip与当前服务器建立的连接比较多。

1、使用ss -a打印出所有连接

# ss -a
Netid State      Recv-Q Send-Q                                  Local Address:Port                                                   Peer Address:Port         
......
nl    UNCONN     768    0                                             tcpdiag:kernel                                                             *                     
nl    UNCONN     4352   0                                             tcpdiag:ss/25880                                                           *              
......
nl    UNCONN     0      0                                                genl:kernel                                                             *                     
nl    UNCONN     0      0                                          scsi-trans:kernel                                                             *                     
p_raw UNCONN     0      0                                                   *:eth0                                                               *                     
u_str LISTEN     0      100                                     public/pickup 13732                                                             * 0                    
u_str LISTEN     0      100                                    public/cleanup 13736                                                             * 0                    
......
tcp   ESTAB      0      0                                   ::ffff:10.39.46.4:d-s-n                                           ::ffff:10.4.106.149:46830                
tcp   ESTAB      0      0                                   ::ffff:10.39.46.4:d-s-n                                           ::ffff:10.4.106.161:45138                
tcp   ESTAB      0      0                                   ::ffff:10.39.46.4:d-s-n                                           ::ffff:10.4.106.132:57338                
tcp   ESTAB      0      0                                   ::ffff:10.39.46.4:d-s-n                                             ::ffff:10.4.82.29:33724                
tcp   ESTAB      0      0                                   ::ffff:10.39.46.4:d-s-n                                           ::ffff:10.4.106.132:49730                  
......

会打印出非常多连接细节

2、使用grep筛选处理ESTAB状态的tcp连接

# ss -a |grep tcp |grep ESTAB 
tcp    ESTAB      0      0       ::ffff:10.39.46.4:d-s-n                ::ffff:10.4.95.183:55187                
tcp    ESTAB      0      0       ::ffff:10.39.46.4:d-s-n                 ::ffff:10.4.82.29:33742                
tcp    ESTAB      0      0       ::ffff:10.39.46.4:ddi-tcp-1             ::ffff:10.4.93.21:51003                      

有些上面的数据后,我想把最右面的那些ip筛选出来,从而可以对他们进行计数统计并按照连接的数量排序打印出来

3、使用cut截取后面的部分

# ss -a |grep tcp |grep ESTAB | cut -c70-
    ::ffff:10.39.10.7:59182                
   ::ffff:10.4.95.183:55187                
    ::ffff:10.4.82.29:33742                

-c参数是指按照字符顺序来截取,-c70-表示截取第70个字符及其后面的所有内容

4、使用grep+正则表达式把ip地址抓出来

# ss -a |grep tcp |grep ESTAB | cut -c70- |grep -Eo ':[1234567890].*:' 
:10.4.95.183:
:10.4.82.29:
:10.4.93.21:

-E参数用来使用正则表达式,-o参数表示我只显示匹配到的内容

5、使用tr去掉冒号

# ss -a |grep tcp |grep ESTAB | cut -c70- |grep -Eo ':[1234567890].*:' |tr ':' ' '
 10.4.95.183 
 10.4.82.29 
 10.4.93.21 

6、使用sortuniq进行排序和计数

# ss -a |grep tcp |grep ESTAB | cut -c70- |grep -Eo ':[1234567890].*:' |tr ':' ' '| sort  |uniq -c
      2  10.11.65.191 
     11  10.39.10.7 
    151  10.39.10.90 
      2  10.39.10.94 

uniq 命令的-c参数用来计数

7、再次使用sort排序

# ss -a |grep tcp |grep ESTAB | cut -c70- |grep -Eo ':[1234567890].*:' |tr ':' ' '| sort  |uniq -c |sort -nr
    217  10.39.46.22 
    151  10.39.10.90 
     89  10.4.106.141 
     76  10.4.106.132 

sort命令的-n参数表示按照数字顺序来排序,-r参数标识逆序排列,也就是从大到小排列

这个结果就是我想要的网络连接数量统计了

下面是我写的几篇关于某个具体命令的用法

  • linux常备工具之grep
  • linux常备工具之cut
  • linux常备工具之tr
  • linux常备工具之sort

你可能感兴趣的:(linux)