Como posso encontrar uma nova linha encontrada em um pipe contínuo?

1

Suponha que você tenha um comando mycmd que envia um fluxo contínuo em um pipe.

Você deseja imprimir apenas as novas ocorrências.

Como você faria isso?

O comando

mycmd | sort -u

não é válido, pois tenho que esperar até que o mycmd termine.

É obviamente possível trabalhar com arquivos, mas tenho certeza de que pode haver uma maneira mais direta.

    
por user31514 27.09.2016 / 00:01

1 resposta

1

sort não mostraria nada, porque sort não pode funcionar nos fluxos de dados que chegam no STDIN que não possuem EOF (End Of File).

sort só funcionará se o mycmd terminar em algum ponto, então sort verá o EOF e trabalhará no conteúdo.

Para obter conteúdo (s) exclusivo (s) em um fluxo de dados, você pode usar awk com uma matriz para armazenar as contagens de registros:

mycmd | awk '!seen[$0]++'

seen[$0] verifica se a linha é vista na matriz seen obtendo seu valor. Se a linha não estiver presente, seen[$0] retornará 0 (false), então o teste de negação ( ! ) se torna verdadeiro e a linha é impressa (ação padrão). ++ incrementa o valor em 1, então da próxima vez o teste de negação seria falso para qualquer linha duplicada.

    
por heemayl 27.09.2016 / 09:01