用计数建立IP的分布

时间:2011-04-26 22:36:43

标签: awk

在DDoS之后在大型日志文件上执行awks时,我试图获得更多dtrace样式分发输出,以便更容易读取输出:

# tail -1000 access_log | awk '{ print $1 }' | sort | uniq -c | sort -nr | awk '{printf("\n%s ",$0) ; for (i = 0; i<$1 ; i++) {printf("*")};}'

  43 192.168.0.1 *******************************************
  38 192.168.0.2 **************************************

希望它看起来像:

       value  ------------- Distribution ------------- count    
 192.168.0.1  @@@@@@@@@                                43 
 192.168.0.2  @@@@@@@@                                 38 

@s是一个较小的数字摘要,而不是数字的*。让它自动扩展每次运行将是一个额外的好处,因为我必须做数学来弄清楚如何对每个计数进行排名。

1 个答案:

答案 0 :(得分:7)

你的管道实际上非常好。你真的只需要它来扩展大数字。我用我的一个Web服务器上的未分类的ip号文件替换了你的tail -1000 access_log | awk '{ print $1 }' |。添加head -20只打印20个最活跃的IP地址。

$  sort ip.txt | uniq -c | sort -nr | \
>  awk 'NR==1{scale=$1/50} \
>       {printf("\n%-23s ",$0) ; \
>        for (i = 0; i<($1/scale) ; i++) {
>            printf("*")}; \
>        }' | head -20

重要的部分是

  • NR==1{scale=$1/50}来计算 缩放因子以适应最大值 数到50个字符,
  • printf("\n%-23s ",$0) ;使用了 左对齐的宽度说明符%-23s 23内的计数和IP地址 角色空间。

我的输出看起来像这样。我屏蔽了IP地址。

   824 xx.xxx.xx.39    **************************************************
   149 xx.xxx.xxx.176  **********
   138 xx.xxx.xxx.191  *********
   137 xx.xxx.xxx.41   *********
   105 xx.xxx.xxx.8    *******
    97 xx.xxx.xxx.21   ******
    96 xx.xxx.xx.220   ******
    91 xx.xx.xxx.198   ******
    87 xx.xxx.xxx.195  ******
    85 xx.xxx.xx.221   ******
    79 xxx.xxx.xxx.86  *****
    69 xx.xx.xx.12     *****
    68 xxx.xxx.xxx.159 *****
    65 xx.xxx.xxx.66   ****
    63 xx.xxx.xx.28    ****
    60 xx.xxx.xxx.104  ****
    59 xxx.xxx.xxx.242 ****
    59 xxx.xx.xxx.66   ****
    56 xx.xxx.xxx.202  ****

这种输出有人为因素的问题。人们通过线条区域(星号)来判断这些图形。由于此显示会随着数字的大小而变化,因此您无法在视觉上比较其中两个图表的任何可靠性。

你的眼睛和大脑要你判断线条的长度。 (我不知道我从哪里学到这一点。可能来自Tufte的书籍,或研究统计数据。)但缩放可能意味着一个图表上的最长行表示800,而另一个图表上的相同行可能仅表示100。眼睛和大脑希望相信这两个大致相等,即使一个是另一个大八倍,并且即使你可以看到原始数字