Mam przychodzący strumień do portu szeregowego, a nowe linie pojawiają się mniej więcej raz na sekundę
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
Chcę usunąć puste linie i datownik resztę.
sed usunie puste wiersze i doda znacznik czasu, ale nie mogę zaktualizować znacznika czasu, po prostu zgłasza czas jego wywołania:
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
Znalazłem ts, część Moreutils, i mogę do niego podłączyć, aby uzyskać znacznik czasu aktualizacji.
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
Jednak nie mogę poprawnie połączyć ts z sed.
To, które wygląda na to, że powinno robić to, co chcę, nie generuje w ogóle żadnych wyników
wren@Raven:~$ cat /dev/ttyUSB0 | sed -e '/^$/d' | ts
^C
wren@Raven:~$
Jednak odwrócenie kolejności rur daje wynik, ale oczywiście nie usuwa linii, które nie są już puste. Inne substytucje działają dobrze, więc wiem, że fajka do sed działa.
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
Więc jestem trochę zaskoczony. Mogę przypuszczalnie sprawić, by sed usunął niechciane linie, ale znacznik czasu przed usunięciem musi być niewłaściwy.
Byłbym wdzięczny za wyjaśnienie i pomoc.
źródło
sed -u
. Jest to kwestia buforowania bloków vs. buforowania linii.bash poradzi sobie z tym w
while read
pętliMożesz usuwać linie tylko z białymi spacjami z trudnym rozszerzaniem parametrów: usuń wszystkie wiodące białe spacje i sprawdź, czy linia jest pusta:
źródło
tail -f /dev/ttyUSB0
zamiast kota lub echa. Będzie działać. Nie wiedziałem, jak to sprawdzić w moim systemie.