Como unbuffer cortar?

8

Eu quero apenas endereços de e-mail que terminem em "@ xyz.nl" do meu arquivo de log de e-mail. Para conseguir isso eu faço:

# tail -f /var/log/mail.log | grep --i --line-buffered "@xyz.nl" | cut -d '@' -f 1 | cut -d '<' -f 2

O - line-buffered com grep é necessário porque, de outro modo, armazenará em buffer sua saída porque o pipe não é considerado um terminal. O Grep irá mostrar linhas como estas:

Aug 29 11:56:01 localhost postfix/smtp[4124]: 05491500123: to=<[email protected]>, relay=123.456.123.456[123.456.123.456]:25, delay=2, delays=0.4/0/0.4/1.2, dsn=2.0.0, status=sent (250 2.0.0 u7T9twxN074009 Message accepted for delivery)

O primeiro corte então faz:

Aug 29 11:56:01 localhost postfix/smtp[4124]: 05491500123: to=<someone

O segundo corte deve gerar:

someone

No entanto, parece que o corte também está em buffer. Se eu iniciar o comando com cat em vez de tail -f , obtenho todos os resultados relevantes (no formato preferido) do arquivo de log. Mas preciso dos resultados do arquivo de log em tempo real.

Eu tentei usar unbuffer para isso:

# tail -f /var/log/mail.log | grep --i --line-buffered "@xyz.nl" | unbuffer cut -d '@' -f 1 | cut -d '<' -f 2

Também tentei:

# unbuffer tail -f /var/log/mail.log | grep --i --line-buffered "@xyz.nl" | unbuffer cut -d '@' -f 1 | cut -d '<' -f 2

... que deve remover o buffer 4K do primeiro corte . No entanto, isso não funciona. Eu sei que é o buffer, porque se eu grep para o nosso domínio local, obtém muito mais acessos, o buffer é preenchido mais cedo e a saída é gerada anteriormente (em lotes 4K).

Então, minha pergunta é: como eu desabafo cut ?

Relacionado: Eu sei sed e (g) o awk pode entregar os endereços de e-mail para mim. Eu tenho tentado, mas ainda sem nenhum resultado. As respostas usando sed ou (g) awk são bem-vindas e podem resolver meu problema direto, mas continuo interessado na resposta nominal da pergunta: como descomprimir o comando de corte. O comando cut não fala em (un) buffering.

    
por Forkbeard 02.09.2016 / 08:53

1 resposta

13

Se você estiver em um sistema usando GNU Coreutils (quase qualquer Linux), você pode tentar stdbuf :

… | stdbuf -oL cut -d '@' -f 1 | …

-oL torna a linha em buffer, que parece o que você deseja.

    
por 02.09.2016 / 08:58

Tags