bash – 从nginx访问日志文件中查找访问/ page1但不访问/ page2的IP地址

我需要从日志文件中选择特定数据.
我需要两个脚本:

>我需要选择仅访问/ page1的所有IP地址
>我需要选择访问/ page1但从未访问/ page2的所有IP地址

我在.tar文件中有我想要的日志.我想将它们解压缩到一个文件夹中,然后我将使用该脚本来解析它们并删除它们.所有重复的IP地址.

这是我到目前为止:

# filter /page1 visitors
cat access.log | grep "/page1" > /tmp/res.txt
# take the IP portion of record
cat res.txt | grep '^[[:alnum:]]*\.[[:alnum:]]*\.[[:alnum:]]*\.[[:alnum:]]*' -o > result.txt

典型的访问日志看起来像

162.158.86.83 - - [22/May/2016:06:31:18 -0400] "GET /page1?vtid=nb3 HTTP/1.1" 301 128 "-" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:46.0) Gecko/20100101 Firefox/46.0"
最佳答案
awk '/^\/page1?/ {print $1}' /path/to/access.log | sort -u > result.txt

如果要计算每个唯一IP的计数,请将sort -u更改为sort | uniq -c

如果要仅匹配/ page1的日志的请求路径字段(而不是整行):

awk '$7 ~ /^\/page1?/ {print $1}' /path/to/access.log | sort -u > result.txt

注意:我认为nginx访问日志与apache访问日志相同.如果没有,请计算nginx日志中的字段(计算每个空格,包括Date:Time和TimeZone之间的字段),并使用正确的字段编号而不是$7

最后,如果要打印IP地址(或主机名,如果它们已经被解析)和请求路径:

awk -v OFS='\t' '$7 ~ /^\/page1?/ {print $1, $7}' /path/to/access.log |
    sort -u > result.txt

要查看已访问/ page1但从未访问/ page2的IP地址:

awk '$7 ~ /^\/page1?/ {print $1}' /path/to/access.log | sort -u > result1.txt
awk '$7 ~ /^\/page2?/ {print $1}' /path/to/access.log | sort -u > result2.txt
comm -2 -3 result1.txt result2.txt

comm’s -2选项禁止仅出现在result2.txt中的行,而-3抑制出现在两个文件中的行.因此输出只出现在results1.txt中.

请参阅man comm了解更多详情.

转载注明原文:bash – 从nginx访问日志文件中查找访问/ page1但不访问/ page2的IP地址 - 代码日志