为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

九州编程 2019-07-01 10:08:24
基于日期范围筛选日志文件条目我的服务器拥有异常高的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在绝对时间内获取最活跃的IPawk -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
查看完整描述

3 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

是的,有多种方法可以做到这一点。我会这么做的。对于初学者来说,不需要管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为单位)


查看完整回答
反对 回复 2019-07-01
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

因为这是共同 Perl任务

因为这和从日志文件中提取最后10分钟直到日志文件结束的时候。

因为我需要他们,所以我(很快)写到:

#!/usr/bin/perl -ws# This script parse logfiles for a specific period of timesub usage {
    printf "Usage: %s -s=<start time> [-e=<end time>] <logfile>\n";
    die $_[0] if $_[0];
    exit 0;}use Date::Parse;usage "No start time submited" unless $s;my $startim=str2time($s) or die;my $endtim=str2time($e) if $e;$endtim=time() unless $e;usage "Logfile not submited" unless $ARGV[0];open my $in, "<" . $ARGV[0] or usage "Can't open '$ARGV[0]' for reading";$_=<$in>;exit unless $_; # empty file# Determining regular expression, depending on log formatmy $logre=qr{^(\S{3}\s+\d{1,2}\s+(\d{2}:){2}\d+)};$logre=qr{^[^\[]*\[(\d+/\S+/(\d+:){3}\d+\s\+\d+)\]} unless /$logre/;while (<$in>) {
    /$logre/ && do {
        my $ltim=str2time($1);
        print if $endtim >= $ltim && $ltim >= $startim;
    };};

这可以用作:

./timelapsinlog.pl -s=09:18 -e=09:24 /path/to/logfile

用于在09H18和09H24之间打印日志。

./timelapsinlog.pl -s='2017/01/23 09:18:12' /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+)         # ^Jan  1 01:23:45^[^\[]*\[(\d+/\S+/(\d+:){3}\d+\s\+\d+)\]    # ^... [01/Jan/2017:01:23:45 +0000]


查看完整回答
反对 回复 2019-07-01
?
Cats萌萌

TA贡献1805条经验 获得超9个赞

如果有人遇到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


查看完整回答
反对 回复 2019-07-01
  • 3 回答
  • 0 关注
  • 380 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信