Saya memiliki aliran masuk di port serial, dengan baris baru muncul sekitar satu kali per detik
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
Saya ingin menghapus garis kosong dan mencatat waktu sisanya.
sed akan menyisihkan baris kosong dan menambahkan timestamp, tapi saya tidak bisa membuat pembaruan timestamp, itu hanya melaporkan waktu itu dipanggil:
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
Saya telah menemukan ts, bagian dari Moreutils, dan dapat menyalurkan ke dalamnya untuk mendapatkan cap waktu pembaruan.
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
Namun, saya tidak bisa menggabungkan ts dengan sed.
Ini, yang sepertinya harus melakukan apa yang saya inginkan, tidak menghasilkan output sama sekali
wren@Raven:~$ cat /dev/ttyUSB0 | sed -e '/^$/d' | ts
^C
wren@Raven:~$
Namun membalik urutan pipa memang menghasilkan output, tetapi tentu saja tidak menghilangkan garis yang tidak lagi kosong. Penggantian lainnya berfungsi dengan baik, jadi saya tahu pipa untuk sed berfungsi.
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
Jadi saya agak bingung. Saya mungkin bisa membuat sed menghapus garis yang tidak diinginkan, tetapi timestamping sebelum penghapusan harus menjadi pendekatan yang salah.
Saya akan sangat menghargai penjelasan dan bantuan.
sed -u
. Ini adalah masalah block-buffering vs line-buffering.