在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是一个较小的计数摘要,而不是数字的*.让它自动按比例缩放将是一个额外的好处,因为我必须做数学来弄清楚如何对每个计数进行排名.
你的管道实际上非常好.你真的只需要它来扩展大数字.我用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.眼睛和大脑想要相信这两者大致相等,即使一个是另一个的八倍,即使你能看到原始数字.