Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 根据日期范围筛选日志文件条目_Linux_Apache_Ubuntu_Awk_Perl - Fatal编程技术网

Linux 根据日期范围筛选日志文件条目

Linux 根据日期范围筛选日志文件条目,linux,apache,ubuntu,awk,perl,Linux,Apache,Ubuntu,Awk,Perl,我的服务器的CPU使用率异常高,我可以看到Apache使用了太多的内存。 我有一种感觉,我被一个IP欺骗了——也许你能帮我找到他 我使用了下面的一行来查找10个最“活跃”的IP: 排名前5位的IP对服务器的请求数量大约是“普通”用户的200倍。但是,我无法确定这5个人是否只是非常频繁的访问者,或者他们正在攻击服务器 是否有办法将上述搜索指定为一个时间间隔,例如最近两个小时或今天10-12之间 干杯 于2011年10月23日更新-我需要的命令: 在过去X小时内获取条目[此处为两小时] awk -v

我的服务器的CPU使用率异常高,我可以看到Apache使用了太多的内存。 我有一种感觉,我被一个IP欺骗了——也许你能帮我找到他

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

排名前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
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
在过去X小时内获取最活跃的IP[此处为两小时]

awk -vDate=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` ' { if ($4 > Date) print Date FS $4}' access.log
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 
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
awk-vDate=`date-d'now-4小时+[%d/%b/%Y:%H:%M:%S`-vDate2=`date-d'now-2小时+[%d/%b/%Y:%H:%M:%S`{if($4>日期和$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` ' { 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 
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
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
在绝对时间范围内获取最活跃的IP

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 
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
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
是的,有多种方法可以做到这一点。以下是我将如何做到这一点。对于初学者,无需通过管道传输cat的输出,只需使用
awk
打开日志文件即可

awk -vDate=`date -d'now-2 hours' +[%d/%b/%Y:%H:%M:%S` '$4 > Date {print Date, $0}' access_log
假设您的日志看起来像我的日志(它们是可配置的),则日期存储在字段4中。并用括号括起来。我在上面所做的是查找过去2小时内的所有内容。
请注意-d'now-2 hours'
或按字面意思翻译为now-2 hours,对我来说是这样的:
[10/Oct/2011:08:55:23

因此,我要做的是存储两小时前的格式化值,并与字段4进行比较。条件表达式应该是直接的。然后我打印日期,后跟输出字段分隔符(OFS,在本例中是空格),后跟整行$0。您可以使用上一个表达式只打印$1(ip地址)

如果要使用范围,请指定两个日期变量并适当构造表达式

所以,如果你想在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'
awk-vDate=`date-d'now-4小时+[%d/%b/%Y:%H:%M:%S`-vDate2=`date-d'now-2小时+[%d/%b/%Y:%H:%M:%S`'$4>日期和$4
下面是我回答的一个关于bash中日期的问题,您可能会觉得这很有帮助。

因为这是一项常见的任务 因为这和日志文件结束前的一段时间不完全一样

因为我需要它们,我(很快)写了这样一篇文章:

#!/usr/bin/perl -ws
# This script parse logfiles for a specific period of time

sub 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 format
my $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;
    };
};
用于打印09h18和09h24之间的日志

./timelapsinlog.pl -s='2017/01/23 09:18:12' /path/to/logfile
用于从
1月23日,9h18'12“
到现在的打印

为了减少perl代码,我使用了
-s
开关来允许从命令行自动分配变量:
-s=09:18
将填充一个变量
$s
,该变量将包含
09:18
。注意不要错过等号
=
,并且没有空格

Nota:这包含两种不同日志标准的不同类型的正则表达式。如果您需要不同的日期/时间格式解析,请发布您自己的正则表达式或发布日志文件中的格式化日期示例

^(\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]

如果有人遇到
awk:invalid-v选项
,下面是一个脚本,用于在预定义的时间范围内获取最活跃的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
cat | 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

我很懒;我会将日志复制到Excel并创建一个透视表…@Ben“现在您有两个问题。"谢谢,老兄!很好的例子,解释得很好。我已经详细阐述了你的代码,以满足我的特定需求,并将其添加到原始问题中,供我自己和其他需要帮助的人参考。我很高兴这能帮上忙。最后一件事。我如何搜索多个日志文件?我正在尝试使用find和xargs,但仍然没有运气:find-name'access。log'| awk-vDate=
date-d'13:20'+[%d/%b/%Y:%H:%M:%S
-vDate2=
date-d'13:40'+[%d/%b/%Y:%H:%M:%S
'{if($4>日期和$4awk聪明到可以猜到您在比较日期?因为我想说这只是比较字符串,而且由于日期的排序与字符串不同(在您使用的默认nginx格式中)…嗯,我做了一些快速测试,上个月的结果比上一天少,所以看起来确实有点broken@matchew很抱歉再次重复这一点,但我非常确定我的观点并不取决于
awk
的版本,而且2018年的nginx似乎使用了与2011年的apache相同的日期格式。问题是如何处理事实上,
[01/Feb/20XX
[02/Feb/20XX
[31/Jan/20XX
?回答得很好,我将此添加到了一个循环中,我可以很容易地调查服务器上发生了什么。如果日期在不同的月份(例如,“may”>“Jun”),这可能再次失败。有关从字符串转换为数字的方法,请参见我上面的注释。简而言之,
monthnum=match(“janfebmarapramayjunjunaugsepoctnovdec”,monthstr)+2)/3