Ich habe einen eingehenden Stream an einer seriellen Schnittstelle, wobei etwa einmal pro Sekunde neue Leitungen angezeigt werden
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
Ich möchte leere Zeilen entfernen und den Rest mit einem Zeitstempel versehen.
sed löscht leere Zeilen und fügt einen Zeitstempel hinzu, aber ich kann das Zeitstempel-Update nicht durchführen. Es gibt nur die Zeit an, zu der es aufgerufen wurde:
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
Ich habe ts gefunden, einen Teil von Moreutils, und kann ihn weiterleiten, um einen aktualisierten Zeitstempel zu erhalten.
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
Allerdings kann ich ts nicht richtig mit sed kombinieren.
Dies, was so aussieht, als ob es tun sollte, was ich will, erzeugt überhaupt keine Ausgabe
wren@Raven:~$ cat /dev/ttyUSB0 | sed -e '/^$/d' | ts
^C
wren@Raven:~$
Das Umkehren der Reihenfolge der Rohre führt zwar zu einer Ausgabe, entfernt jedoch natürlich keine Linien, die nicht mehr leer sind. Andere Substitutionen funktionieren einwandfrei, daher weiß ich, dass das zu sedierende Rohr funktioniert.
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
Also bin ich ein bisschen verblüfft. Vermutlich kann ich sed dazu bringen, die unerwünschten Linien zu entfernen, aber das Zeitstempeln vor dem Entfernen muss der falsche Ansatz sein.
Ich würde mich über eine Erklärung und Hilfe freuen.
quelle
sed -u
. Es handelt sich um ein Problem zwischen Blockpufferung und Zeilenpufferung.Bash kann dies in einer
while read
Schleife behandelnSie können Zeilen mit nur Leerzeichen mit einer kniffligen Parametererweiterung entfernen: Entfernen Sie alle führenden Leerzeichen und prüfen Sie, ob die Zeile leer ist:
quelle
tail -f /dev/ttyUSB0
anstelle von Katze oder Echo. Es wird weiterlaufen. Ich wusste nicht, wie ich das auf meinem System testen sollte.