![我不知道如何剪切这个文件并找到特定部分的独特单词](https://linux22.com/image/131184/%E6%88%91%E4%B8%8D%E7%9F%A5%E9%81%93%E5%A6%82%E4%BD%95%E5%89%AA%E5%88%87%E8%BF%99%E4%B8%AA%E6%96%87%E4%BB%B6%E5%B9%B6%E6%89%BE%E5%88%B0%E7%89%B9%E5%AE%9A%E9%83%A8%E5%88%86%E7%9A%84%E7%8B%AC%E7%89%B9%E5%8D%95%E8%AF%8D.png)
因此,有一个名为 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
对您的示例产生任何影响,因为没有重复项,但如果文件的其余部分有,那么它只会打印出特定列中的唯一值。
如果您只想打印文件名,则可以substr
在awk
命令中使用参数:
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。