网络连接统计(netstat与awk)

使用awk统计netstat结果

  • 统计当前各种状态的连接总数:
[root@test ~]# netstat -anlpt | awk 'BEGIN{printf "%12s\t%s\n","State","Total_Nums"} {if (NR>2) a[$6]++} END {for(i in a){printf "%12s\t%i\n",i,a[i] | "sort -k 1"}}'
       State    Total_Nums
  CLOSE_WAIT    5
 ESTABLISHED    181
      LISTEN    36
    SYN_RECV    1
   TIME_WAIT    356
[root@test ~]#
  1. netstat -anlpt       显示当前计算机所有的TCP连接
  2. BEGIN{printf “%12s\t%s\n”,”State”,”Total_Nums”}         在处理开始前使用printf格式化打印出标题行,使用第一列固定占位 12 个字符(%ns: 输出字符串。n是数字,指输出几个字符;%ni:输出整数。n是数字)
  3. if (NR>2)             跳过前两行
  4. a[$6]++               以第6列$6(即状态列)的内容 作为数组a字符下标 并进行数学累加作为其值;如 a[LISTEN]++、a[LISTEN]=36。
  5. END {for(i in a) 当一切都处理完成后,使用for循环取出 数组a 中的下标赋予变量 i;如 i=LISTEN。
  6. {printf “%12s\t%i\n”,i,a[i]       使用printf格式化打印出 i 变量 a[i] 的数组值;如  LISTEN  36。
  7. | “sort -k 1”}}      调用外部命令 sort 进行排序。
  • 统计当前与外部IP连接的个数和状态
[root@test ~]# netstat -anlpt | grep -v LISTEN | awk '{split($5,b,":") ;if (NR > 2 && b[1] !~ /^[\s| ]*$/) printf "%s\t%-12s\n",b[1],$6}' | sort | uniq -c | sort -rnk 1 | awk 'BEGIN {printf "%s\t%s\t%s\n","Con_Num","Remote_Addr","State"} {print $0}'
Con_Num Remote_Addr     State
     94 10.168.156.133  ESTABLISHED 
     58 10.117.61.39    ESTABLISHED 
     11 10.146.70.103   ESTABLISHED 
      6 10.162.80.57    ESTABLISHED 
      4 106.11.68.13    CLOSE_WAIT  
      2 127.0.0.1       ESTABLISHED 
      1 183.129.165.131 ESTABLISHED 
      1 140.205.140.205 ESTABLISHED 
      1 140.205.140.205 CLOSE_WAIT  
      1 127.0.0.1       TIME_WAIT   
      1 10.31.120.233   ESTABLISHED 
      1 10.28.14.70     ESTABLISHED 
      1 10.168.156.216  TIME_WAIT   
      1 10.117.55.98    ESTABLISHED 
      1 100.116.239.94  TIME_WAIT   
      1 100.116.239.74  TIME_WAIT   
      1 100.116.239.32  TIME_WAIT   
      1 100.116.239.19  TIME_WAIT   
      1 100.116.239.115 TIME_WAIT   
[root@test ~]#
  1. netstat -anlpt | grep -v LISTEN    查看当前所有连接,并过滤掉本地监听类型的
  2. split($5,b,”:”)       以 : 切分第5列(Foreign Address)的值,并放置到 数组b;如 b[1]=10.168.156.133  b[2]=12345。
  3. if (NR > 2 && b[1] !~ /^[\s| ]*$/)    跳过前两行,且 数组 b[1] 的值不为空(过滤掉IPv6地址)
  4. printf “%s\t%-12s\n”,b[1],$6    格式化输出 b[1]  $6值;如 10.168.156.133  ESTABLISHED。
  5. | sort                     将awk输出排序。
  6. | uniq -c               将排序后的数据进行去重并统计。
  7. | sort -rnk 1         将统计后的数据按 第1列(统计数值) 进行数字的降序排列。
  8. awk ‘BEGIN {printf “%s\t%s\t%s\n”,”Con_Num”,”Remote_Addr”,”State”} {print $0}’       给最后的输出加上标题。
  • 查看某一类状态的连接统计

将上一例中grep -v LISTEN改为过滤你要查看的状态即可。

发表评论

error: Content is protected !!