OVH Cloud OVH Cloud

substitution en temps reel

21 réponses
Avatar
geo cherchetout
Bonjour,
Je bricole sous GNU/Linux-Mandriva 2006. Je reçois par le port série de
mon pc des résultats de mesures successives en provenance d'un «
scopemètre ». Ces résultats se présentent sous la forme de lignes comme
suit :

$ cat /dev/ttyS0

k0s0Gs0CNOW rms AC+DC 1.125mV, 0Hz, OL

k0s0Gs0CNOW rms AC+DC 1.132mV, 0Hz, OL

k0s0Gs0CNOW rms AC+DC 1.139mV, 0Hz, OL

...

Je souhaiterais que chaque enregistrement comporte, en remplacement de
la chaîne « k0s0Gs0CNOW » la date et l'heure de réception des données.
Je tatonne avec sed mais vainement. Par exemple, j'ai essayé :
$ cat /dev/ttyS0 | sed "s/k0s0Gs0CNOW/`date`/g" ou
$ sed -e 's/k0s0Gs0CNOW/`date`/g' < /dev/ttyS0
mais la date n'apparaît pas dans les mesures affichées.
Un petit coup de pouce, svp ?

1 réponse

1 2 3
Avatar
geo cherchetout
Le 08.02.2006 15:38, *Stephane Chazelas* a écrit fort à propos :

Ce qui va arriver, par contre, c'est que comme perl ou awk
voient que leur sortie standard n'est plus un terminal, ils vont
bufferiser leur sortie (eviter de tout envoyer au fichier a
chaque fois qu'il y a quelque chose a ecrire, mais envoyer par
blocs quand il y en a suffisemment). Les lignes auront le bon
horodatage, mais le contenu du fichier ne sera pas mis a jour
immediatement.


En effet, c'est probablement ce qui rendait vains tous mes efforts
depuis un bon moment, parce que je ne reçois au plus qu'une quarantaine
d'octets toutes les deux secondes. Je me demandais si je ne me prenais
pas les pieds dans le tapis avec tee ou avec « > fichier ».
Un phénomène comparable se produit quand j'utilise minicom avec l'option
« -C fichier », mais au moins le fichier est à jour dès la fermeture de
minicom à n'importe quel instant.

Si ca ne te convient pas, tu peux dire a gawk de "flusher" son
buffer apres chaque ecriture:

gawk '
{
sub(/[^[:blank:]]+/, strftime("%F %T"))
print
fflush()
}' < /dev/ttyS0 > fichier


$ gawk '{sub(/[^[:blank:]]+/, strftime("%F %T")); print; fflush()}' <
/dev/ttyS0 | tee record
2006-02-08 17:29:58 rms AC+DC 1.000mV, 0Hz, OL

2006-02-08 17:30:00 rms AC+DC 1.000mV, 0Hz, OL

...
C'est bon. :-)

pour perl, tu peux positionner la variable $OUTPUT_AUTOFLUSH ($|
en plus court) a 1:

perl -MPOSIX -pe '
BEGIN{$OUTPUT_AUTOFLUSH = 1}
s/S+/strftime("%F %T", localtime)/e
' < /dev/ttyS0 > fichier

$ perl -MPOSIX -pe 'BEGIN{$OUTPUT_AUTOFLUSH = 1} s/S+/strftime("%F %T",

localtime)/e' < /dev/ttyS0 | tee record

Ça fonctionne mais le tampon est encore de 4 ko exactement. En revanche,
c'est parfait avec :

$ perl -MPOSIX -pe 'BEGIN{$| = 1} s/S+/strftime("%F %T", localtime)/e'
< /dev/ttyS0 | tee record

Mais boîte à outils est à présent bien garnie. Merci encore.

1 2 3