需要 Apache 日志/Grep 命令帮助

需要 Apache 日志/Grep 命令帮助

我需要能够查看某个 IP 在某一天发出的所有请求。

我不熟悉 grep,想知道是否有人可以帮助我。

答案1

有什么方法可以将搜索结果限制在特定的一天吗?

对于这样的问题,我喜欢使用 awk;您可以在单个命令中匹配多个字段。如果我们假设您使用的是标准 Apache 日志格式,则字段 1 是 IP 地址,字段 5 是访问日期:

$ awk '$1 ~ /8\.8\.8\.8/ && $4 ~ /15\/Dec\/2009/ { print }' /var/log/apache2/access.log

awk处理文件中的每一行,并根据空格将其拆分为名为 、 等的变量$1$2您可以使用$2 ~ /REGEX/语法匹配它们,并且可以在多个字段上进行匹配。

Apache 以荒谬的 DD/Mon/YYYY 格式存储日期,因此您需要转义该/字符,这会使匹配日期有点难以处理。

单独的命令{ print }将打印整行(awk 也将其识别为$0)。如果您只想发出特定字段,则可以将这些字段添加到打印语句中。如果您只想打印请求的 URI,则可以执行以下操作:

$ awk '$1 ~ /8\.8\.8\.8/ && $4 ~ /15\/Dec\/2009/ { print $7 }' /var/log/apache2/access.log

因为请求 URI 是日志中的字段 7。

答案2

假设您的日志位于,/var/log/apache2/access.log并且假设您的 Apache 日志采用通用或组合格式:

$ grep "^w\.x\.y\.z" /var/log/apache2/access.log

例如搜索 127.0.0.1

$ grep "^127\.0\.0\.1" /var/log/apache2/access.log

答案3

作为上述答案的替代,没有正则表达式的“复杂性”(对于某些人来说)。

我首先检查(尾部)日志文件的日期格式,如下所示:

tail filename
127.0.0.1 - - [31/Jan/2017:18:33:08 +0100] "OPTIONS * HTTP/1.0" 200 155
127.0.0.1 - - [31/Jan/2017:18:33:09 +0100] "OPTIONS * HTTP/1.0" 200 155
127.0.0.1 - - [31/Jan/2017:18:33:12 +0100] "OPTIONS * HTTP/1.0" 200 155
127.0.0.1 - - [31/Jan/2017:18:33:13 +0100] "OPTIONS * HTTP/1.0" 200 155
127.0.0.1 - - [31/Jan/2017:18:33:14 +0100] "OPTIONS * HTTP/1.0" 200 155
127.0.0.1 - - [31/Jan/2017:18:33:15 +0100] "OPTIONS * HTTP/1.0" 200 155
127.0.0.1 - - [31/Jan/2017:18:33:16 +0100] "OPTIONS * HTTP/1.0" 200 155
127.0.0.1 - - [31/Jan/2017:18:33:17 +0100] "OPTIONS * HTTP/1.0" 200 155

然后我简单地将日期复制/粘贴为文字字符串,如下所示:

grep "31/Jan/2017" file | grep 127.0.0.1

或者,有时我需要将其缩小到小时,因此我只需复制小时即可:

grep "31/Jan/2017:18" file | grep 127.0.0.1

相关内容