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之後是什麼。日誌文件很長。我想它應該是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