基于日期范围筛选日志文件条目

基于日期范围筛选日志文件条目

我的服务器拥有异常高的CPU使用率,我可以看到Apache使用的内存太多了。我有种感觉,我正被一个IP所迷惑-也许你能帮我找到他?

我使用了下面的一行,以找到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


九州编程
浏览 376回答 3
3回答

慕容708150

是的,有多种方法可以做到这一点。我会这么做的。对于初学者来说,不需要管cat的输出,只需用awk.awk&nbsp;-vDate=`date&nbsp;-d'now-2&nbsp;hours'&nbsp;+[%d/%b/%Y:%H:%M:%S`&nbsp;'$4&nbsp;>&nbsp;Date&nbsp;{print&nbsp;Date,&nbsp;$0}'&nbsp;access_log假设您的日志看起来像我的日志(它们是可配置的),而不是存储在字段4中的日期。我在上面所做的是在过去的2小时内找到所有的东西。Note the -d'now-2 hours'或者从字面上说是减2小时,对我来说是这样的:[10/Oct/2011:08:55:23所以我要做的是存储两个小时前格式化的值,并与字段四进行比较。条件表达式应该是直接向前的,然后打印日期,然后是输出字段分隔符(在本例中是OFS-或空格),后面是整行$0。您可以使用以前的表达式,只需打印$1(IP地址)。awk&nbsp;-vDate=`date&nbsp;-d'now-2&nbsp;hours'&nbsp;+[%d/%b/%Y:%H:%M:%S`&nbsp;'$4&nbsp;>&nbsp;Date&nbsp;{print&nbsp;$1}'&nbsp;|&nbsp;sort&nbsp;&nbsp;|uniq&nbsp;-c&nbsp;|sort&nbsp;-n&nbsp;|&nbsp;tail如果要使用范围,请指定两个日期变量并适当地构造表达式。所以,如果您想在2到4小时前找到一些东西,您的表达式可能会如下所示awk&nbsp;-vDate=`date&nbsp;-d'now-4&nbsp;hours'&nbsp;+[%d/%b/%Y:%H:%M:%S`&nbsp;-vDate2=`date&nbsp;-d'now-2&nbsp;hours'&nbsp;+[%d/%b/%Y:%H:%M:%S`&nbsp;'$4&nbsp;>&nbsp;Date&nbsp;&&&nbsp;$4&nbsp;<&nbsp;Date2&nbsp;{print&nbsp;Date,&nbsp;Date2,&nbsp;$4}&nbsp;access_log'下面是我回答的关于bash中日期的一个问题,您可能会发现这很有帮助。当周星期一的打印日期(以bash为单位)

饮歌长啸

因为这是共同&nbsp;Perl任务因为这和从日志文件中提取最后10分钟直到日志文件结束的时候。因为我需要他们,所以我(很快)写到:#!/usr/bin/perl&nbsp;-ws#&nbsp;This&nbsp;script&nbsp;parse&nbsp;logfiles&nbsp;for&nbsp;a&nbsp;specific&nbsp;period&nbsp;of&nbsp;timesub&nbsp;usage&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;printf&nbsp;"Usage:&nbsp;%s&nbsp;-s=<start&nbsp;time>&nbsp;[-e=<end&nbsp;time>]&nbsp;<logfile>\n"; &nbsp;&nbsp;&nbsp;&nbsp;die&nbsp;$_[0]&nbsp;if&nbsp;$_[0]; &nbsp;&nbsp;&nbsp;&nbsp;exit&nbsp;0;}use&nbsp;Date::Parse;usage&nbsp;"No&nbsp;start&nbsp;time&nbsp;submited"&nbsp;unless&nbsp;$s;my&nbsp;$startim=str2time($s)&nbsp;or&nbsp;die;my&nbsp;$endtim=str2time($e)&nbsp;if&nbsp;$e;$endtim=time()&nbsp;unless&nbsp;$e;usage&nbsp;"Logfile&nbsp;not&nbsp;submited"&nbsp;unless&nbsp;$ARGV[0];open&nbsp;my&nbsp;$in,&nbsp;"<"&nbsp;.&nbsp;$ARGV[0]&nbsp;or&nbsp;usage&nbsp;"Can't&nbsp;open&nbsp;'$ARGV[0]'&nbsp;for&nbsp;reading";$_=<$in>;exit&nbsp;unless&nbsp;$_;&nbsp;#&nbsp;empty&nbsp;file#&nbsp;Determining&nbsp;regular&nbsp;expression,&nbsp;depending&nbsp;on&nbsp;log&nbsp;formatmy&nbsp;$logre=qr{^(\S{3}\s+\d{1,2}\s+(\d{2}:){2}\d+)};$logre=qr{^[^\[]*\[(\d+/\S+/(\d+:){3}\d+\s\+\d+)\]}&nbsp;unless&nbsp;/$logre/;while&nbsp;(<$in>)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;/$logre/&nbsp;&&&nbsp;do&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my&nbsp;$ltim=str2time($1); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;if&nbsp;$endtim&nbsp;>=&nbsp;$ltim&nbsp;&&&nbsp;$ltim&nbsp;>=&nbsp;$startim; &nbsp;&nbsp;&nbsp;&nbsp;};};这可以用作:./timelapsinlog.pl&nbsp;-s=09:18&nbsp;-e=09:24&nbsp;/path/to/logfile用于在09H18和09H24之间打印日志。./timelapsinlog.pl&nbsp;-s='2017/01/23&nbsp;09:18:12'&nbsp;/path/to/logfile供印刷用january 23th, 9h18'12"上至现在.为了减少Perl代码,我使用了-s切换到允许从命令行自动分配变量:-s=09:18将填充一个变量$s夹住09:18..注意不要错过等号。=没有空位!诺塔:这有两种不同的雷吉两种不同的日志标准。如果需要不同的日期/时间格式解析,可以发布自己的regex,或者从日志文件中发布格式化日期的示例。^(\S{3}\s+\d{1,2}\s+(\d{2}:){2}\d+)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;^Jan&nbsp;&nbsp;1&nbsp;01:23:45^[^\[]*\[(\d+/\S+/(\d+:){3}\d+\s\+\d+)\]&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;^...&nbsp;[01/Jan/2017:01:23:45&nbsp;+0000]

Cats萌萌

如果有人遇到awk: invalid -v option,下面是一个脚本,用于在预定义的时间范围内获取最活跃的IP:cat&nbsp;<FILE_NAME>&nbsp;|&nbsp;awk&nbsp;'$4&nbsp;>=&nbsp;"[04/Jul/2017:07:00:00"&nbsp;&&&nbsp;$4&nbsp;<&nbsp;"[04/Jul/2017:08:00:00"'&nbsp;|&nbsp;awk&nbsp;'{print&nbsp;$1}'&nbsp;|&nbsp;sort&nbsp;-n&nbsp;|&nbsp;uniq&nbsp;-c&nbsp;|&nbsp;sort&nbsp;-nr&nbsp;|&nbsp;head&nbsp;-20
打开App,查看更多内容
随时随地看视频慕课网APP