Bash

使用 bash 對日誌數據進行排序

  • March 5, 2016

我有一個包含此類條目的日誌文件

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之後是什麼。日誌文件很長。我想它應該是uniq -u命令的組合。

假設您的日期採用 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

引用自:https://unix.stackexchange.com/questions/267749