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.
fonte
sed -u
. É um problema de buffer de bloco vs. buffer de linha.bash pode lidar com isso em um
while read
loopVocê pode remover linhas apenas com espaços em branco com uma expansão de parâmetro complicada: remova todos os espaços em branco iniciais e veja se a linha está vazia:
fonte
tail -f /dev/ttyUSB0
vez de gato ou eco. Ele continuará funcionando. Eu não sabia como testar isso no meu sistema.