2017-07-10 1 views
0

J'ai un fichier * .dat qui augmente de manière incrémentielle pendant plusieurs heures. Je veux surveiller une certaine valeur dans le temps afin que je puisse les comparer, regarder sa tendance et ainsi de suite.Bash: Stocke le dernier mot de chaque ligne commençant par

Ce que j'ai jusqu'à présent:

LTIME=$(stat -c %Z test2.dat) 

while true  
do 
    ATIME=$(stat -c %Z test2.dat) 

    if [[ "$ATIME" != "$LTIME" ]] 
    then  
     grep "15 RT" test2.dat > test_grep2.txt 
     LTIME=$ATIME 
    fi 
    sleep 60 
done 

qui met à jour un fichier texte artificiel avec chaque incrément du * .dat. Retours des choses comme:

  15 RT 0.000  0.000  0.000  0.000  0.000  -1.4666E+04 
     15 RT 0.000  0.000  0.000  0.000  0.000  -1.7073E+04 
     15 RT 0.000  0.000  0.000  0.000  0.000  -1.9379E+04 
     15 RT 0.000  0.000  0.000  0.000  0.000  -2.1583E+04 

J'ai aussi celui-ci:

while read line 
do [ -z "$line" ] && continue ;echo ${line##* } 
done < test_grep2.txt 

qui prend le dernier "mot" de chaque ligne de ce txt dans la console:

1.0225E+04 
1.1738E+04 
1.3219E+04 
1.4668E+04 
1.6083E+04 
2.4867E+04 
2.5943E+04 

Mais je havent a encore réussi à mettre ces deux ensemble. Ce travail juste ne (les derniers « mots » ne sont pas imprimés comme le txt grep ne cesse de se mettre à jour):

[ -e test_grep.txt ] && rm test_grep.txt 

LTIME=$(stat -c %Z test2.dat) 

while true  
do 
    ATIME=$(stat -c %Z test2.dat) 

    if [[ "$ATIME" != "$LTIME" ]] 
    then 
    grep -i "15 RT" test.dat > test_grep.txt 

    LTIME=$ATIME 
    fi 
    sleep 5 
done 

datime=$(stat -c %Z test_grep.txt) 


while true  
do 
    datime2=$(stat -c %Z test_grep.txt) 

    if [[ "$datime2" != "$datime" ]] 
    then 
     while read line 

    do [ -z "$line" ] && continue ;echo ${line##* } 
    done < test_grep.txt 


    datime=$datime2 
    fi 
    sleep 5 
done 

Et je crois qu'il doit y avoir un moyen plus efficace et élégante que l'utilisation d'un fichier temporaire.

Puis-je vous demander votre aide pour cela? Sourcing le dernier "mot" de chaque ligne qui contient la chaîne "15 RT" et soit les stocker ou enregistrer dans un fichier pour comparaison/évaluation ultérieure. Et tout cela "en ligne". Comme le * .dat se développe encore et encore.

Merci beaucoup!

+0

Réduit le problème. – ceving

+0

Bon point, merci ... Bien qu'un peu inutile. – Jewenile

+0

C'est très utile, car cela augmente la chance d'obtenir une réponse. – ceving

Répondre

2

Oui, cela devrait le faire:

tail -f growing.dat | awk '/15 RT/ {print $NF}' 

tail -f est très efficace, car il écoute les fichiers modifier événement et ne sort que de nouvelles lignes lorsqu'il est ajouté (pas besoin de boucle et constamment vérifier si le fichier a été modifié) . awk script affichera simplement le dernier champ pour chaque ligne qui contient 15 RT.

Modifier. De plus, si vous souhaitez stocker cette sortie vers un fichier, et surveiller les valeurs dans le terminal, vous pouvez utiliser tee:

tail -f growing.dat | awk '/15 RT/ {print $NF}' | tee values.log 

Depuis awk est sortie en mémoire tampon, pour voir les valeurs en temps réel, vous pouvez rincer la sortie après chaque mise à jour:

tail -f growing.dat | awk '/15 RT/ {print $NF; fflush()}' | tee values.log 

Edit 2. Si le fichier n'existe pas d'abord, vous devez utiliser tail -F:

tail -F growing.dat | awk '/15 RT/ {print $NF}' 

cette façon, tail gardera une nouvelle tentative d'ouvrir le fichier si elle est inaccessible, il ressemble à ceci (message est imprimé à stderr):

tail: cannot open 'growing.dat' for reading: No such file or directory 
tail: 'growing.dat' has appeared; following new file 
-5.1583E+04 
+0

Merci beaucoup! Cela le rend beaucoup plus simple!Les données ainsi obtenues peuvent-elles être stockées dans une liste (par exemple) ou dans un fichier pour ce traitement supplémentaire (en ligne)? Je vous remercie! – Jewenile

+0

Oui, j'ai mis à jour la réponse. – randomir

+0

Maintenant c'est presque parfait. Le * .dat doit juste être déjà présent. Supposons qu'il ne sera pas créé plus tard. Quand je regarde juste, j'utilise habituellement pendant que! queue -f muj_soubor.sta; fais dormir 1; fait mais ne peut pas imaginer comment l'accompagner dans ce cas. Puis-je demander un dernier indice? Merci! – Jewenile