Eu tenho um fluxo de entrada em uma porta serial, com novas linhas aparecendo cerca de uma vez por segundo
wren@Raven:~$ cat /dev/ttyUSB0
A_Sensor1,B_22.00,C_50.00
A_Sensor1,B_22.00,C_50.00
A_Sensor1,B_22.00,C_50.00
A_Sensor1,B_22.00,C_50.00
A_Sensor1,B_22.00,C_50.00
Quero retirar as linhas em branco e marcar o restante do tempo.
O sed selecionará as linhas em branco e adicionará um carimbo de data / hora, mas não posso fazer a atualização do carimbo de data / hora, apenas informa a hora em que foi chamada:
wren@Raven:~$ cat /dev/ttyUSB0 | sed -e '/^$/d' -e "s/$/`date +\,%F\,%T`/"
A_Sensor1,B_22.00,C_50.00,2014-05-14,09:44:42
A_Sensor1,B_22.00,C_50.00,2014-05-14,09:44:42
A_Sensor1,B_22.00,C_50.00,2014-05-14,09:44:42
A_Sensor1,B_22.00,C_50.00,2014-05-14,09:44:42
A_Sensor1,B_22.00,C_50.00,2014-05-14,09:44:42
A_Sensor1,B_22.00,C_50.00,2014-05-14,09:44:42
A_Sensor1,B_22.00,C_50.00,2014-05-14,09:44:42
^C
Eu encontrei o ts, parte do Moreutils, e posso entrar nele para obter um carimbo de data / hora de atualização.
wren@Raven:~$ cat /dev/ttyUSB0 | ts
May 14 09:49:26 A_Sensor1,B_22.00,C_50.00
May 14 09:49:26
May 14 09:49:27 A_Sensor1,B_22.00,C_50.00
^C
No entanto, não consigo combinar ts com sed.
Isso, que parece que deve fazer o que eu quero, não produz saída alguma
wren@Raven:~$ cat /dev/ttyUSB0 | sed -e '/^$/d' | ts
^C
wren@Raven:~$
No entanto, reverter a ordem dos tubos produz uma saída, mas é claro que não tira as linhas que não estão mais em branco. Outras substituições funcionam bem, então eu sei que o tubo para sed está funcionando.
wren@Raven:~$ cat /dev/ttyUSB0 | ts | sed -e '/^$/d'
May 14 10:07:25 A_Sensor1,B_22.00,C_50.00
May 14 10:07:25
May 14 10:07:26 A_Sensor1,B_22.00,C_50.00
May 14 10:07:26
^C
Então, eu estou um pouco confuso. Presumivelmente, posso fazer com que o sed remova as linhas indesejadas, mas o carimbo de data e hora antes da remoção deve ser a abordagem errada.
Gostaria de receber uma explicação e alguma ajuda.
sed -u
. É um problema de buffer de bloco vs. buffer de linha.