使用Awk,我可以获得一个带有给定错误号的URL列表:
awk '($9 ~ /404/)' /var/log/nginx/access.log | awk '{print $7}' | sort | uniq -c | sort -rn
很好,很花哨。
但我们希望通过将该结果与已知的404 URL
列表进行匹配来进一步完善它示例:
awk '($9 ~ /404/)' /var/log/nginx/access.log | awk '{print $7} '| sort | uniq -c | sort -k 2 -r | awk '{print > "/mnt/tmp/404error.txt"}'
今天收益:
1 /going-out/restaurants/the-current-restaurent.htm
1 /going-out/restaurants/mare.HTML
1 /going-out/report-content/?cid=5
1 /going-out/report-content/?cid=38550
1 /going-out/report-content/?cid=380
第二天:
1 /going-out/ru/%d0%bd%d0%be%d1%87%d0%bd%d0%b0%d1%8f-%d0%b6%d0%b8%d0%b7%d0%bd%d1%8c-%d0%bd%d0%b0-%d0%bf%d1%85%d1%83%d0%ba%d0%b5%d1%82%d0%b5/%d1%81%d0%be%d0%b2%d0%b5%d1%82%d1%8b-%d0%bb%d1%8e%d0%b1%d0%b8%d1%82%d0%b5%d0%bb%d1%8f%d0%bc-%d0%bd%d0%be%d1%87%d0%bd%d1%8b%d1%85-%d1%80%d0%b0%d0%b7%d0%b2%d0%bb%d0%b5%d1%87%d0%b5%d0%bd%d0%b8%d0%b9/
1 /going-out/restaurants/the-current-restaurent.htm
1 /going-out/restaurants/mare.HTML
1 /going-out/report-content/?cid=5
1 /going-out/report-content/?cid=38550
1 /going-out/report-content/?cid=380
1 /going-out/report-content/?cid=29968
1 /going-out/report-content/?cid=29823
目标是只拥有新网址。
那时我迷路了,我知道我可以将第一个文件推入数组,我认为我可以对第二个文件做同样的事情(但是在第二个数组中),然后可能(不确定awk是否确实有容量)简单地穿过它们,并保持不匹配的东西。
任何帮助都将完全体会。
答案 0 :(得分:0)
您可以使用grep --fixed-strings --file=FILEALL FILENEW
或comm -23 FILENEW FILEALL
。 FILEALL是包含已找到网址的文件,FILENEW包含今天找到的网页。对于comm
,必须对这两个文件进行排序。
http://www.gnu.org/software/gawk/manual/gawk.html#Other-Inherited-Files
http://linux.die.net/man/1/comm
我认为comm
效率更高,因为我使用的是排序文件,但我没有对此进行测试。
答案 1 :(得分:0)
因此,您有一个$9
字段可能与/404/
匹配的文件。如果是,则要存储第7个字段。然后,计算它们中总共出现了多少,但就好像它们之前没有出现在你拥有的文件中一样。
我认为所有这一切都可以用这个完成(未经测试,因为我没有样本输入数据):
awk 'FNR==NR {seen[$2];next}
$9 ~ /404/ {if !($7 in seen) a[$7]++}
END {for (i in a) print a[i], i}' old_file log_file
这会将包含数据的文件中的第二列存储到数组seen[]
中。然后,如果之前没有看到,则浏览新文件并存储第7列。最后,它打印计数器。
由于您的旧awk
版本看起来不支持语法index in array
,因此您可以使用此解决方法:
$9 ~ /404/ {for (i in seen) {if (i==$7) next} a[$7]++}
请注意,您必须使用veeery旧版本,因为这是在1987年推出的:
A.1 Major Changes Between V7 and SVR3.1
awk语言在版本7的发布之间发生了很大变化 Unix(1978)和首次制作的新版本 可在System V Release 3.1(1987)中找到。本节总结了 更改,交叉引用更多详细信息:
for语句之外的'indx in array'(参见 参考元素)
答案 2 :(得分:0)
我想出了以下内容:
awk 'BEGIN {
while (getline < "/mnt/tmp/404error.txt") {
A[$1] = $1;
};
while (getline < "/var/log/nginx/access.log") {
if( $9 ~ /404/)
{
{
exist[$7] = $7 ;
}
{
if ($7 in A) blah += 1; else new[$7];
}
}
}
{
asort(exist);
for(i in exist)
print exist[i] > "/mnt/tmp/404error.txt"
}
{
asorti(new);
for(i in new)
print new[i] > "/mnt/tmp/new404error.txt"
}
}
' | mutt -s "subject" -a /mnt/tmp/new404error.txt -- whoever@mail.net, whatever@mail.net
似乎在提供我想要的东西(差不多)。
但是我相信它太过冗长,也许你们其中一个天才可以改善它 感谢