gab*_*be. 12 logs ip text-processing
因此,我在遭受 DDOS 攻击时将其一起破解,以从我的日志中提取顽皮的ip。任何人都有任何改进或其他建议以使其更好?
这是一般的想法:
和字符串o'pipes:
cut --delim " " -f7 /var/log/apache_access | sort | uniq -c | sort -rn > sorted-ips.txt
我一直用这个:
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
Run Code Online (Sandbox Code Playgroud)
将产生:
4 A
1 B
2 A
Run Code Online (Sandbox Code Playgroud)
不是想要的输出。所以我们对第一列进行排序(在这种情况下是 ips,但我们可以对其他列进行排序)然后uniq
它们,最后对计数进行升序排序,以便我可以看到最高的违规者。
Marco Ceppi 是awk
一个更好的工具,但 awk 也是一个更好的工具sort
,uniq
因为该逻辑可以移入awk
. 如果您只是拖尾 1000 行,这并没有太大区别,但是如果您想查看一个巨大的多 gig 日志文件,将其移动到awk
.
cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n
会做你需要的,但对于大文件要快得多。它在 awk 中创建一个 IP 数组,使用 IP 地址作为键,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 gigs),这是一个速度比较:
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