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

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

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

  1. 我需要选择所有只访问过的IP地址/page1
  2. 我需要选择所有访问过/page1但从未访问过的IP地址/page2

我在.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"

答案1

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

如果您想要每个唯一 IP 的计数,请更改sort -usort | uniq -c

如果您只想将日志的请求路径字段(而不是整行)与/page1

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

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

最后,如果您想打印 IP 地址(或主机名,如果已解析)和请求路径:

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

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

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-2选项会抑制仅出现在 中的行result2.txt,并-3抑制同时出现在两个文件中的行。因此,输出是仅出现在 中的行results1.txt

请参阅man comm了解更多详细信息。

答案2

  • 创建访问过 Page1 的 IP 的排序列表
  • 创建访问 Page2 的 IP 的排序列表
  • 在两个列表上使用“diff”来查找那些访问了一个页面但没有访问另一页面的页面(列表开头的“>”或“<”符号区分来自 Page1 的页面和来自 Page2 的页面)

相关内容