Para responder a pergunta diretamente, sed
está armazenando em buffer e esse é o único problema.
Você pode consertar isso dizendo para não armazenar em buffer com o sinalizador -u
/ --unbuffered
:
sed -u '/^$/d' /dev/ttyUSB0 | ts
Com um arnês de teste (mas você precisará executá-lo como prova):
$ (echo -e 'banana\n\n'; sleep 2; echo 'cheese') | sed -u '/^$/d' | ts
May 14 11:26:05 banana
May 14 11:26:07 cheese
Você pode se deparar com situações semelhantes com outros editores de fluxo. Eles aparentemente todos querem amortecer um pouco. Todos eles têm soluções alternativas embora. Aqui estão alguns dos comandos que testei:
... | mawk -W interactive '/./' | ts
... | gawk '/./ { print $0; fflush(); }' | ts
... | grep --line-buffered '.' | ts
... | perl -n -e 'print if /./' | ts
Outra ideia é deixar apenas gawk
lidar com isso. Ele pode filtrar por linhas não vazias e fazer a impressão de data para você (graças a SO's Kieron ):
awk '/./ { print strftime("%Y-%m-%d %H:%M:%S"), $0; fflush(); }' /dev/ttyUSB0
Isso é liberado logo após as linhas entrarem. gawk
é especialmente útil aqui se você quer fazer outras coisas ... Se você quiser checar se a quarta coluna de saída (pre-%)ts
) corresponde a um regex, você pode (por exemplo, $4~/\d{4}/
). Awk (e suas variantes) são muito flexíveis para o processamento de fluxo.
Outro arsenal de testes:
$ gawk '/./ { print strftime("%Y-%m-%d %H:%M:%S"), $0; fflush(); }' <(
echo -e 'banana\n\n';
sleep 2;
echo 'cheese'
)
2014-05-14 11:13:59 banana
2014-05-14 11:14:01 cheese