我需要能够查看某个IP在某一天发出的所有请求。
我不熟悉grep,想知道是否有人可以帮我一把。
无论如何,我可以将search结果限制在特定的一天吗?
我喜欢awk这样的问题; 您可以在一个命令中匹配多个字段。 如果我们假定您使用的是标准的Apache日志格式,则字段1是IP地址,字段5是访问date:
$ awk '$1 ~ /8\.8\.8\.8/ && $4 ~ /15\/Dec\/2009/ { print }' /var/log/apache2/access.log
awk
处理一个文件中的每一行,并将其分割成名为$1
, $2
variables。 您可以将它们与$2 ~ /REGEX/
语法进行匹配,并且可以匹配多个字段。
Apache以荒谬的DD / Mon / YYYY格式存储date,因此您需要转义/
字符,这会使匹配date稍微笨拙。
一个单独的{ print }
将打印整行(awk也知道这是$0
)。 如果您只想发出特定的字段,可以将其添加到打印语句中。 如果你只想打印请求的URI,你可以这样做:
$ awk '$1 ~ /8\.8\.8\.8/ && $4 ~ /15\/Dec\/2009/ { print $7 }' /var/log/apache2/access.log
由于请求URI是日志中的字段7。
假设您的日志位于/var/log/apache2/access.log
并假定您的Apache日志是通用或组合格式:
$ grep "^w\.x\.y\.z" /var/log/apache2/access.log
例如search127.0.0.1
$ grep "^127\.0\.0\.1" /var/log/apache2/access.log
作为上述答案的替代,没有“复杂性”(对于某些)的正则expression式。
我首先检查(尾)日志文件的date格式,如下所示:
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
然后我简单地复制/粘贴date作为一个文字string,如下所示:
grep "31/Jan/2017" file | grep 127.0.0.1
或者,有时我需要缩小到一小时,所以我只是复制它的时间:
grep "31/Jan/2017:18" file | grep 127.0.0.1