Ho un flusso in entrata su una porta seriale, con nuove linee che appaiono circa una volta al secondo
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
Voglio eliminare le righe vuote e timestamp il resto.
sed eliminerà le righe vuote e aggiungerà un timestamp, ma non riesco a fare l'aggiornamento del timestamp, riporta solo l'ora in cui è stato invocato:
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
Ho trovato ts, parte di Moreutils, e posso convogliarlo per ottenere un timestamp di aggiornamento.
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
Tuttavia, non riesco a combinare correttamente ts con sed.
Questo, che sembra che dovrebbe fare quello che voglio, non produce alcun risultato
wren@Raven:~$ cat /dev/ttyUSB0 | sed -e '/^$/d' | ts
^C
wren@Raven:~$
Tuttavia, invertire l'ordine dei tubi produce un output, ma ovviamente non spoglia le linee che non sono più vuote. Altre sostituzioni funzionano bene, quindi so che la pipa su sed funziona.
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
Quindi sono un po 'sconcertato. Posso presumere che sed rimuova le linee indesiderate, ma il timestamp prima della rimozione deve essere l'approccio sbagliato.
Gradirei una spiegazione e qualche aiuto.
sed -u
. Si tratta di un problema di buffering del blocco rispetto al buffering della linea.