Como selecionar uma linha com a data e hora mais recentes

1

Eu tenho um arquivo de texto (espaço como delimitador) como mostrado abaixo:

Date           Time---------OtherFields-------Source IP   Destination IP 

2014-11-24  12:58:59.290                      1.2.3.4         5.6.7.8

2014-11-24  12:59:01.402                      1.2.3.8         5.6.7.8

2014-11-24  13:00:01.542                      12.14.25.1      5.6.7.8

2014-11-25  14:00:02.5                        12.14.25.2      5.6.7.8

2014-11-25  15:00:01.542                      12.14.25.1      6.7.8.9

2014-11-25  16:00:01.542                      12.14.25.5      6.7.8.9

Para o IP de destino 5.6.7.8, desejo selecionar uma linha com a data e hora mais recente e salvá-la em um novo arquivo de texto para processamento posterior. A mesma coisa se aplica a todos os diferentes endereços IP de destino. Existem toneladas de linhas como essa.

A saída desejada deve ser assim.

2014-11-25  14:00:02.5                        12.14.25.2      5.6.7.8

2014-11-25  16:00:01.542                      12.14.25.5      6.7.8.9

Nenhuma lógica está clicando para mim. Qualquer ajuda seria apreciada. Obrigado

    
por Swatesh Pakhare 19.01.2016 / 17:21

2 respostas

1
for dest in $(awk '{print $NF}' mylogfile | sort | uniq)
do
  grep ${dest} mylogfile | sort -k1 -k2 | tail -1
done


1    $(awk '{print $NF}' mylogfile | sort | uniq)

imprima o último campo de cada linha no logfile, que é o seu IP de destruição. classifique-o para que endereços IP idênticos estejam em blocos consecutivos. uniq é imprimir apenas uma instância de blobk de linhas idênticas

2 & 4   do ... done   

Eu acho que isso é auto-explicativo. A construção geral do loop

3    grep ${dest} mylogfile | sort -k1 -k2 | tail -1

encontre linhas com um endereço IP (assume que este endereço IP não está se repetindo em nenhum outro campo, exceto o último), classifique primeiro o campo 1 e depois o campo 2, o último registro de data / hora na última linha . tail -1 pega essa última linha

    
por 19.01.2016 / 17:35
1

Você pode tentar com os seguintes awk :

awk '{ x = $1" "$2; if (x > a[$4]) { a[$4] = x; b[$4] = $0; } } END { for (i in b) { print b[i]; } }' file

Mas como ele contém duas matrizes na memória pode não ser muito útil para arquivos muito grandes.

    
por 19.01.2016 / 17:50