J'ai un flux entrant sur un port série, avec de nouvelles lignes apparaissant environ une fois par seconde
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
Je souhaite supprimer les lignes vides et horodater le reste.
sed supprimera les lignes vides et ajoutera un horodatage, mais je ne peux pas faire la mise à jour de l'horodatage, il indique simplement l'heure à laquelle il a été invoqué:
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
J'ai trouvé ts, une partie de Moreutils, et je peux y accéder pour obtenir un horodatage de mise à jour.
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
Cependant, je ne peux pas combiner correctement ts avec sed.
Cela, qui semble faire ce que je veux, ne produit aucune sortie
wren@Raven:~$ cat /dev/ttyUSB0 | sed -e '/^$/d' | ts
^C
wren@Raven:~$
Cependant, inverser l'ordre des tuyaux produit une sortie, mais bien sûr, ne supprime pas les lignes qui ne sont plus vierges. D'autres substitutions fonctionnent bien, donc je sais que le tuyau à sed fonctionne.
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
Je suis donc un peu déconcerté. Je peux probablement faire en sorte que sed supprime les lignes indésirables, mais l'horodatage avant la suppression doit être la mauvaise approche.
J'apprécierais une explication et un peu d'aide.
la source
sed -u
. Il s'agit d'un problème de mise en mémoire tampon de bloc par rapport à la mise en mémoire tampon de ligne.bash peut gérer cela en
while read
boucleVous pouvez supprimer des lignes avec uniquement des espaces blancs avec une expansion de paramètre délicate: supprimez tous les espaces blancs de début et voyez si la ligne est vide:
la source
tail -f /dev/ttyUSB0
plutôt que chat ou écho. Il continuera de fonctionner. Je ne savais pas comment tester cela sur mon système.