シリアルポートに着信ストリームがあり、毎秒約1回新しいラインが表示されます
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
空白行を取り除き、残りにタイムスタンプを付けたい。
sedは空白行をカリングしてタイムスタンプを追加しますが、タイムスタンプを更新することはできません。呼び出された時間を報告するだけです。
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
Moreutilsの一部であるtsを見つけました。これにパイプして更新タイムスタンプを取得できます。
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
ただし、tsとsedを適切に組み合わせることができません。
これは私が望むことをするように見えるが、出力をまったく生成しない
wren@Raven:~$ cat /dev/ttyUSB0 | sed -e '/^$/d' | ts
^C
wren@Raven:~$
ただし、パイプの順序を逆にしても出力は生成されますが、もちろん空白ではなくなった行は取り除かれません。他の置換は問題なく機能するので、sedへのパイプが機能していることがわかります。
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
だから私は少し困惑しています。私はおそらくsedに不要な行を削除させることができますが、削除する前にそれらにタイムスタンプを付けるのは間違ったアプローチでなければなりません。
説明と助けをお願いします。
sed -u
。これは、ブロックバッファリングとラインバッファリングの問題です。