Como ordenar ou uniq um feed ativo

0

Estou tentando classificar e isolar o IP de um feed tcpdump ao vivo.

tcpdump -n -i tun0 "tcp[tcpflags] & (tcp-syn) != 0" | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}

funciona bem, mas quando tento adicionar o programa uniq , ele falha:

tcpdump -n -i tun0 "tcp[tcpflags] & (tcp-syn) != 0" | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" |  uniq -u

não retorna nada.

Mesmo com sort -u .

Alguma ideia de como corrigir isso?

    
por ChiseledAbs 08.07.2016 / 12:29

1 resposta

1

Você está enfrentando um problema teórico. sort não pode imprimir nada até que tenha processado toda a entrada. uniq irá apenas apertar linhas repetidas (por isso é tão frequentemente precedido por sort ), então sua saída será diferente da sua entrada somente se a entrada tiver a mesma linha duas vezes seguidas. Se sua entrada for apenas um pouco aleatória, você provavelmente não notará a diferença.

Sua melhor aposta é um programa perl simples que lê a linha de entrada por linha e verifica se já foi visto. Caso contrário, imprime a entrada e a adiciona à tabela de hash das entradas já vistas.

#!/usr/bin/perl
my %LINES ;

while (<STDIN>) {

    if (! $LINES{$_}) {
        $LINES{$_} = 1 ;
        print $_ ;
    }
}

Naturalmente, sua lista de linhas já vistas crescerá, assim como a memória do seu programa.

Não sei ao certo para que você usaria isso, mas acho que adicionaria a data atual à impressão e, talvez, ao hash para que se pudesse remover entradas depois de n horas .

    
por 09.07.2016 / 00:05

Tags