根据日期范围过滤日志文件条目

新手上路,请多包涵

我的服务器的 CPU 使用率异常高,我可以看到 Apache 使用了太多内存。我有一种感觉,我正在被一个 IP DOS - 也许你可以帮我找到攻击者?

我使用以下行来查找 10 个最“活跃”的 IP:

 cat access.log | awk '{print $1}' |sort  |uniq -c |sort -n |tail

前 5 个 IP 对服务器的请求大约是“普通”用户的 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

原文由 sqren 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 723
2 个回答

是的,有多种方法可以做到这一点。这就是我将如何去做。对于初学者,无需管道输出 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 中的日期的问题,您可能会觉得有帮助。 打印当前一周的星期一的日期(在 bash 中)

原文由 matchew 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果有人遇到 awk: invalid -v option ,这里有一个脚本可以在预定义的时间范围内获取最活跃的 IP:

 cat <FILE_NAME> | awk '$4 >= "[04/Jul/2017:07:00:00" && $4 < "[04/Jul/2017:08:00:00"' | awk '{print $1}' | sort -n | uniq -c | sort -nr | head -20

原文由 Szántó Zoltán 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题