使用 bash 对日志数据进行排序

使用 bash 对日志数据进行排序

我有一个包含此类条目的日志文件

192.168.1.1;query=/etc/security/limits.conf;date=02.03.16
192.168.1.1;query=/etc/security/limits.conf;date=01.06.15
192.168.1.2;query=/etc/security/limits.conf;date=02.03.16
192.168.1.1;query=/etc/security/limits.conf;date=12.07.15
192.168.1.2;query=/etc/security/limits.conf;date=03.01.16
192.168.1.1;query=/etc/security/limits.conf;date=02.11.15

我只需要提取每个 IP 只出现一次的 uniq 条目。所以应该是

192.168.1.1;query=/etc/security/limits.conf;date=02.03.16
192.168.1.2;query=/etc/security/limits.conf;date=02.03.16

不管IP之后会发生什么。日志文件很长。我想它应该是组合优尼克-u命令。

答案1

假设您的日期采用 mm.dd.yy 格式

sort -k1,1 -k3.12,3.13nr -k3.6,3.7nr -k3.9,3.10nr -t';' file  |
 sort -k1,1 -u -t';'

192.168.1.1;query=/etc/security/limits.conf;date=02.03.16
192.168.1.2;query=/etc/security/limits.conf;date=03.01.16

按 IP 字段排序,然后按相反顺序按日期字段排序(因此每个 IP 的最新日期首先排序)。将其通过管道传输到另一个sort,这次是通过 IP 字段,但指定-u以确保返回每个 IP 的一条记录。由于-u意味着稳定排序,因此返回每个 IP 的第一条记录(具有最近日期的记录)

另一方面,如果您的日期采用 dd.mm.yy 格式

sort -k1,1 -k3.12,3.13nr -k3.9,3.10nr -k3.6,3.7nr -t';' file |
sort -k1,1 -u -t';'

192.168.1.1;query=/etc/security/limits.conf;date=02.03.16
192.168.1.2;query=/etc/security/limits.conf;date=02.03.16

相关内容