因此,在遭受DDOS攻击以将顽皮的 ip从我的日志中拉出时,我将它们一起砍掉了。任何人都有任何改进或其他建议可以使它更好吗?
这是一般的想法:
- 仅从记录文件中提取IP
- 排序他们
- uniq数一下
- 再次排序
和字符串o'pipes:
cut --delim " " -f7 /var/log/apache_access | sort | uniq -c | sort -rn > sorted-ips.txt
因此,在遭受DDOS攻击以将顽皮的 ip从我的日志中拉出时,我将它们一起砍掉了。任何人都有任何改进或其他建议可以使它更好吗?
这是一般的想法:
和字符串o'pipes:
cut --delim " " -f7 /var/log/apache_access | sort | uniq -c | sort -rn > sorted-ips.txt
Answers:
我一直使用这个:
tail -1000 /var/log/apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
有了tail
我就可以设定我真正想走多远的限制-如果您不使用日志旋转(无论出于何种原因),那是很好的选择,第二次我要利用awk
-因为大多数日志都是用空格分隔的,所以我通过添加适当的$
变量,我可以拉出其他信息(可能是他们击中的URL,状态,浏览器等),从而摆脱了自我困扰。最后,uniq
它的一个缺陷仅适用于接触对-IE:
A
A
A
A
B
A
A
将产生:
4 A
1 B
2 A
不是所需的输出。因此,我们先对第一列进行排序(在本例中为ips,但我们可以对其他列进行排序),然后对uniq
它们进行排序,最后对计数进行升序排序,这样我就可以看到违法者人数最多。
-k1
是多余的,(1)只有一个键(2)sort
无论如何都将第一个单词用作键。
Marco Ceppi是awk
一个更好的工具,但是awk也是一个更好的工具sort
,uniq
因为该逻辑可以移入awk
。如果仅尾随1000行,这并没有多大区别,但是如果您要查看巨大的多演出日志文件,将其移入可能要快几个数量级awk
。
cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n
将完成您需要的操作,但是对于大文件则要快得多。它使用IP地址作为键并将IP出现的次数作为值,在awk中创建IP数组。
之所以要加快速度,是因为awk一次传递了数据并完成了大部分工作,除了对最终输出进行排序。使用另一种方法,如果传输日志中有1,000,000行,则awk读取那1,000,000行吐出1,000,000 IP,然后对整个1,000,000 IP进行排序,将现在已排序的1,000,000 IP发送给uniq,从而将其缩小到更小排序之前的数据量。awk无需在1,000,000个IP上进行遍历/进行多次遍历,而是一次遍历几乎可以完成所有操作。
在笔记本电脑上使用5,513,132行Apache日志(1.1演出),这是速度比较:
cat ./apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
cat ./apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n