在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是一个较小的数字摘要,而不是数字的*。让它自动扩展每次运行将是一个额外的好处,因为我必须做数学来弄清楚如何对每个计数进行排名。
答案 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。眼睛和大脑希望相信这两个大致相等,即使一个是另一个大八倍,并且即使你可以看到原始数字。