我不知道如何剪切这个文件并找到特定部分的独特单词

我不知道如何剪切这个文件并找到特定部分的独特单词

因此,有一个名为 access_log 的访问日志条目文件,我应该找到在 Web 服务器上访问的所有唯一文件。 access_log 的格式如下,这只是摘录:

66.249.75.4 - - [14/Dec/2015:08:25:18 -0600] "GET /robots.txt HTTP/1.1" 404 1012 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.75.4 - - [14/Dec/2015:08:25:18 -0600] "GET /~robert/class2.cgi HTTP/1.1" 404 1012 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
66.249.75.4 - - [14/Dec/2015:08:30:19 -0600] "GET /~robert/class3.cgi HTTP/1.1" 404 1012 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
202.46.61.93 - - [14/Dec/2015:09:07:34 -0600] "GET / HTTP/1.1" 200 5208 "-" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)"

这些文件(例如第一个“robots.txt”)位于单词 GET、HEAD 或 POST 之后。我尝试过使用 cut 命令,使用 " 作为分隔符,但没有起作用。我真的不知道如何分隔这样的文件上的字段,所以我可以比较它们。如果有人能指出我正确的方向,我真的很感激。

编辑:弄清楚了,你是对的@MichaelHomer。我的语法错误,所以这就是为什么 cut 对我不起作用。我使用空间作为分隔符并且它起作用了。

答案1

以下是您提供的示例的演练。

awk打印出您可以指定的列和行。我建议查看该man页面和 Google 以获取更多参考。在您的情况下,分隔符是分隔每一列的空格。它会有所不同,因为在您到目前为止提供的内容中,每行都有不同的文本,这将使列的位置不同,但对于前三行,您可以从以下内容开始:

cat access_log | awk 'NR==1,NR==3 {print $7}' | sort -u

NR==1,NR==3打印出第 1 行到第 3 行

{print $7}打印出第七列,这是您需要的文件名。请记住,它并不总是第七列,因为每行中的文本可能不同。

sort -u打印出唯一值

输出是:

/robots.txt
/~robert/class2.cgi
/~robert/class3.cgi

最后一部分不会sort对您的示例产生任何影响,因为没有重复项,但如果文件的其余部分有,那么它只会打印出特定列中的唯一值。

如果您只想打印文件名,则可以substrawk命令中使用参数:

cat access_log | awk 'NR==1 {print substr($7,2,10)} NR==2,NR==3 {print substr($7,10,10)}'

输出将是:

robots.txt
class2.cgi
class3.cgi

解释:

NR==1 {print substr($7,2,10)}对于字段 7 中的第一行,从第 2 个位置开始,打印出 10 个字符。

NR==2,NR==3 {print substr($7,10,10)}对于字段 7 中的第二行到第三行,从第十个位置开始,打印出 10 个字符。

您可能需要修改列和值,因为文件的其余部分可能不同,并且不会总是排列在相同的位置,但这应该可以帮助您开始。这似乎需要花很多时间,但进行一些研究会让你走向正确的方向

答案2

另一种方法是,为您提供每个唯一文件命中的计数:

awk '{print $7}' access_log | sort | uniq -c | sort -rn

或者,如果您想要在特定日期点击,您可以先 grep 日期:

fgrep "14/Dec/2015" access_log | awk '{print $7}' | sort | uniq -c | sort -rn

有点相关,您可以使用上面的方法通过将印刷品从 7 美元更改为 1 美元来找到您网站的唯一访问者(至少是唯一的 IP)。当我的网站遭到 DoS 攻击时,我个人会使用相同的命令来查找要阻止网络的 IP。

相关内容