问题描述
我的服务器的CPU使用率异常高,我可以看到Apache使用了太多的内存。我有一种感觉,我被一个IP所包围-也许您可以帮助我找到他?
我使用以下行来查找10个最”active” IP:
cat access.log | awk '{print $1}' |sort |uniq -c |sort -n |tail
前5个IP对服务器的请求大约是”average”用户的200倍。但是,我无法确定这5位访问者是否只是非常频繁的访问者,或者他们正在攻击服务器。
有没有办法将上述搜索指定到一个时间间隔,例如最近两个小时还是今天的10-12点之间?
干杯!
2011年10月23日更新-我需要的命令:
在过去X个小时内获取条目[这里两个小时]
awk -vDate=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date) print Date FS $4}' access.log
在最近的X个小时内(这里有两个小时)获得最活跃的IP
awk -vDate=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date) print $1}' access.log | sort |uniq -c |sort -n | tail
获取相对时间跨度内的条目
awk -vDate=`date -d'now-4 hours' +[%d/%b/%Y:%H:%M:%S` -vDate2=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date && $4 < Date2) print Date FS Date2 FS $4}' access.log
获取绝对时间范围内的条目
awk -vDate=`date -d '13:20' +[%d/%b/%Y:%H:%M:%S` -vDate2=`date -d'13:30' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date && $4 < Date2) print $0}' access.log
在绝对时间内获得最活跃的IP
awk -vDate=`date -d '13:20' +[%d/%b/%Y:%H:%M:%S` -vDate2=`date -d'13:30' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date && $4 < Date2) print $1}' access.log | sort |uniq -c |sort -n | tail
最佳思路
是的,有多种方法可以做到这一点。这是我将如何处理的。对于初学者,无需通过管道传递cat的输出,只需使用awk
打开日志文件。
awk -vDate=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` '$4 > Date {print Date, $0}' access_log
假设您的日志看起来像我的日志(它们是可配置的),则日期存储在字段4中,并放在方括号中。我在上面所做的就是在过去2小时内找到所有内容。 Note the -d'now-2 hours'
或现在翻译字面意思是减去2小时,对我来说是这样的:[10/Oct/2011:08:55:23
因此,我要做的是存储两个小时前的格式化值,并与第四字段进行比较。条件表达式应该简单明了,然后打印日期,然后打印输出字段分隔符(OFS-在这种情况下为空格),然后打印整行$ 0。您可以使用以前的表达式,仅打印$ 1(IP地址)
awk -vDate=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` '$4 > Date {print $1}' | sort |uniq -c |sort -n | tail
如果要使用范围,请指定两个日期变量并适当地构造表达式。
因此,如果您想在2-4小时之前找到一些东西,您的表情可能看起来像这样
awk -vDate=`date -d'now-4 hours' +[%d/%b/%Y:%H:%M:%S` -vDate2=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` '$4 > Date && $4 < Date2 {print Date, Date2, $4} access_log'
这是我回答的有关bash中日期的问题,您可能会觉得有帮助。 Print date for the monday of the current week (in bash)