用计数建立IP的分布

Jac*_*eck 5 awk

在DDoS之后在大型日志文件上执行awk时,我试图获得更多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 **************************************
Run Code Online (Sandbox Code Playgroud)

希望它看起来像:

       value  ------------- Distribution ------------- count    
 192.168.0.1  @@@@@@@@@                                43 
 192.168.0.2  @@@@@@@@                                 38 
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*ll' 7

你的管道实际上非常好.你真的只需要它来扩展大数字.我用tail -1000 access_log | awk '{ print $1 }' |我的一个Web服务器上的未分类的ip号文件替换了你.添加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
Run Code Online (Sandbox Code Playgroud)

重要的部分是

  • 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  ****
Run Code Online (Sandbox Code Playgroud)

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

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