Tengo una transmisión entrante en un puerto serie, con nuevas líneas que aparecen aproximadamente una 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
Quiero eliminar líneas en blanco y marcar el tiempo del resto.
sed eliminará líneas en blanco y agregará una marca de tiempo, pero no puedo hacer la actualización de la marca de tiempo, solo informa la hora en que se invocó:
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
He encontrado ts, parte de Moreutils, y puedo canalizarlo para obtener una marca de tiempo de actualización.
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
Sin embargo, no puedo combinar adecuadamente ts con sed.
Esto, que parece que debería hacer lo que quiero, no produce ningún resultado
wren@Raven:~$ cat /dev/ttyUSB0 | sed -e '/^$/d' | ts
^C
wren@Raven:~$
Sin embargo, invertir el orden de las tuberías produce una salida, pero por supuesto no elimina las líneas que ya no están en blanco. Otras sustituciones funcionan bien, así que sé que la tubería a 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
Así que estoy un poco desconcertado. Presumiblemente, puedo hacer que sed elimine las líneas no deseadas, pero la marca de tiempo antes de la eliminación debe ser el enfoque incorrecto.
Agradecería una explicación y algo de ayuda.
fuente
sed -u
. Es un problema de búfer de bloque frente a búfer de línea.bash puede manejar esto en un
while read
buclePuede eliminar líneas con solo espacios en blanco con una complicada expansión de parámetros: elimine todos los espacios en blanco iniciales y vea si la línea está vacía:
fuente
tail -f /dev/ttyUSB0
lugar de gato o eco. Seguirá funcionando. No sabía cómo probar esto en mi sistema.