Classificar dados de log com o bash

3

Eu tenho um arquivo de log contendo tais entradas

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

Eu preciso extrair apenas entradas uniq onde apenas uma vez a cada IP ocorreu. Então deveria ser

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

Não importa o que vem depois do IP. O arquivo de log é longo. Eu acho que deve ser uma combinação do comando uniq -u .

    
por Demontager 05.03.2016 / 03:27

1 resposta

2

Supondo que suas datas estejam no formato 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

Classifique pelo campo IP seguido pelo campo de data na ordem inversa (assim, as datas mais recentes para cada tipo de IP primeiro). Canalize isso para outro sort , desta vez pelo campo IP, mas especificando -u para garantir que um registro para cada IP seja retornado. Como -u implica em ordenação estável, o primeiro registro para cada IP (aquele com a data mais recente) é retornado

Se as datas, por outro lado, estiverem no formato 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
    
por 05.03.2016 / 03:47

Tags