LInux排序/uniqapache日志

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

我有小文件(100)行的web请求(apachestd格式),有来自客户端的多个请求。我只想在我的文件中有一个来自唯一IP的请求(行)列表,并且是最新的条目

到目前为止,我已经 /home/$:cat all.txt | awk'{print$1}'| sort-u |“{打印整行??}”


上面给出了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的重复请求。请给出更多输入和所需输出的示例。