2018-05-24 23:57:30 1.1.1.1 8.8.4.4
2018-05-24 23:57:32 2.2.2.2 8.8.4.4
2018-05-24 23:58:12 8.8.8.8 8.8.4.4
2018-05-24 23:58:23 8.8.8.8 8.8.4.4
2018-05-24 23:59:40 8.8.8.8 8.8.4.4
2018-05-24 23:59:51 8.8.8.8 8.8.4.4
Como eu tenho o arquivo de log no formato acima. Agora preciso analisá-lo e a saída deve ser semelhante a abaixo (mostrando apenas a primeira e a última linha comparando a terceira e a quarta coluna se os dados da linha forem repetidos.
2018-05-24 23:57:30 1.1.1.1 8.8.4.4
2018-05-24 23:57:32 2.2.2.2 8.8.4.4
2018-05-24 23:58:12 8.8.8.8 8.8.4.4
2018-05-24 23:59:51 8.8.8.8 8.8.4.4
Perl para o resgate:
-n
lê a entrada linha por linha e executa o código para cada linha.-a
divide cada linha de entrada em espaço em branco na matriz @F.Com
awk
:a
first
matriz associada mantém a primeira linha ocorrida com a combinação de chaves da coluna nº 3 e coluna nº 4, mas alast
matriz mantém a última linha com as mesmas chaves todas as vezes.Depois que todas as linhas foram lidas, os valores na
first
matriz são as linhas que ocorreram no início (com diferentes colunas nº 3, nº 4) e os valores emlast
são as linhas que ocorreram no último.Em seguida, na
END
impressão, os valores salvos emfirst
array e a seguir emlast
. Isso(last[x] != first[x]? ORS last[x]:"")
é usado para evitar a duplicação da linha quando essa é a única linha única sem nenhuma combinação repetida das colunas 3 e 4.Você também pode pegar linhas únicas comparando apenas as colunas 3,4 e, em seguida, acrescentar a última linha neste caso. Mas isso pode resultar em uma duplicata da última linha se todas as outras linhas tiverem 3ª e 4ª colunas diferentes.
Em seguida, basta adicionar outro tubo ao uniq para remover, se necessário.
{uniq <your_file> -f2; tail -n1 <your_file>; } | cat | uniq
-f aqui pula os primeiros 2 campos delimitados por espaço.
§ Como funciona.
primeira variante
segunda variante
teste
Entrada (complicada para teste)
Saída (ambas as variantes)
§ Como funciona.
¶ É elaborado outro método que utiliza o editor sed.