LInux排序/uniqapache日志
我有小文件(100)行的web请求(apachestd格式),有来自客户端的多个请求。我只想在我的文件中有一个来自唯一IP的请求(行)列表,并且是最新的条目 到目前为止,我已经 /home/$:cat all.txt | awk'{print$1}'| sort-u |“{打印整行??}”LInux排序/uniqapache日志,linux,sorting,unique,logging,Linux,Sorting,Unique,Logging,我有小文件(100)行的web请求(apachestd格式),有来自客户端的多个请求。我只想在我的文件中有一个来自唯一IP的请求(行)列表,并且是最新的条目 到目前为止,我已经 /home/$:cat all.txt | awk'{print$1}'| sort-u |“{打印整行??}” 上面给出了IP(大约30个,这是正确的),现在我还需要线路的其余部分(请求)。我讨厌unique没有与sort相同的选项,或者sort不能做它所说的,我认为这应该可以工作[1] tac access.log
上面给出了IP(大约30个,这是正确的),现在我还需要线路的其余部分(请求)。我讨厌unique没有与sort相同的选项,或者sort不能做它所说的,我认为这应该可以工作[1]
tac access.log | sort -fb -k1V -u
但遗憾的是,事实并非如此
因此,我们似乎被困在做一些愚蠢的事情,比如
cat all.txt | awk '{ print $1}' | sort -u | while read ip
do
tac all.txt | grep "^$ip" -h | head -1
done
这是非常低效的,但“有效”(还没有测试:模块输入错误)
[1] 根据手册页,使用关联数组跟踪已找到的IP:
awk '{
if (!found[$1]) {
print;
found[$1]=1;
}
}' all.txt
这将为每个IP打印第一行。如果您想要最后一个,那么:
awk '
{ found[$1] = $0 }
END {
for (ip in found)
print found[ip]
}
' all.txt
以下方面应起作用:
tac access.log | sort -f -k1,1 -us
这将以相反的顺序获取文件,并使用第一个字段进行稳定排序,只保留唯一的项。示例行:152.111.yy.xx---[04/Apr/2011:14:49:26+0200]“POST/requrst.php?q=123”,因此我只希望最后一次对ip的POST请求没有对任何ip的重复请求。请给出更多输入和所需输出的示例。