Lecture de fichier sous unix

Fermé
LEBENATOR - 12 avril 2010 à 15:27
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 - 13 avril 2010 à 12:26
Bonjour à tous et merci du temps que vous allez consacrer à me répondre !

J'ai ce bout de code :

COUNT=0
SEUIL=8

cat $FILE | while read line
do

#récupère la valeur numérique a la position $3
COUNT='echo "$line" | awk '{print $3}''

echo "$COUNT"
if [ $COUNT > $SEUIL ]
then
        echo "Anormal error on : $line"
        ((STATUS=STATUS+1))
        echo "$STATUS"
fi

done

echo "$COUNT" #n'a plus de valeur à l'issu du while
echo "$STATUS" #n'a plus de valeur à l'issu du while


donc voilà, je comprends pas pourquoi ces variables deviennent vides après le while, a savoir que dans le while les valeurs sont les bonnes
aucun message d'erreur

A voir également:

6 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
12 avril 2010 à 18:19
En fin de compte, le problème vient du "pipe" (cat $FILE_VISUAL_REPORT | while read line), qui s'exécute dans un processus fils et donc indépendamment du parent :-(

Essaie comme ça

#!/bin/bash

COUNT=0
SEUIL=8

#--- temporary files
FILE_REPORT="/log/report.txt"
FILE_VISUAL_REPORT="log/visual_report.txt"
FILE_TEMP="/tmp/script_report_tmp.txt"
FILE_TEMP2="/tmp/script_report_tmp2.txt"

#--------------------------------------------------

#--------------------------------------------------
#--- Begin
echo "*************" > $FILE_VISUAL_REPORT
echo "Global Report" >> $FILE_VISUAL_REPORT
echo "*************" >> $FILE_VISUAL_REPORT
awk '/>/ {split($0 $NF,v,"-->");err[v[2]]=0} ; /ERROR/ {err[v[2]]++;e[i++]=$NF} ; END{for (n in err)print n,err[n]}' $FILE_REPORT | sed "s/checking//" | awk '{if($NF>=8){print $1, $3, $NF, "Errors"}}' >> $FILE_VISUAL_REPORT

exec < ${FILE_VISUAL_REPORT}

# cat $FILE_VISUAL_REPORT | while read line
while read line
do

COUNT=$(echo "$line" | awk '{if($3>8){print $3}}')

echo "$COUNT"
if [ $COUNT -gt $SEUIL ]
then
        echo "condition du count"
        echo "Anormal error on : $line"
        STATUS=$((STATUS + 1))
        echo "$STATUS"
fi

done

echo "$COUNT"
echo "$STATUS"

if [ $STATUS -ne 0 ]
then
        echo "condition du statut"
        MODULESTATUS=ERROR
fi

echo "FIN"

#--------------------------------------------------

#--------------------------------------------------
#--- Clean
if [ -e $FILE_REPORT ]
then
        rm $FILE_REPORT
fi
if [ -e $FILE_VISUAL_REPORT ]
then
        rm $FILE_VISUAL_REPORT
fi
1
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
12 avril 2010 à 15:40
Salut,

Parce que ton script est plein d'erreur de syntaxe ;-(

En gras les choses à changer ;-\

COUNT=0
SEUIL=8

cat $FILE | while read line
do

#récupère la valeur numérique a la position $3
COUNT=$(echo "$line" | awk '{print $3}')

echo "$COUNT"
if [ $COUNT -gt $SEUIL ]
then
        echo "Anormal error on : $line"
        ((STATUS+1))
        echo "$STATUS"
fi

done

echo "$COUNT" #n'a plus de valeur à l'issu du while
echo "$STATUS" #n'a plus de valeur à l'issu du while
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
12 avril 2010 à 16:34
((STATUS+1))
ça incrémente STATUS ça ? J'aurai mis ((STATUS++)) ou ((STATUS+=1))
pour le if, j'ai ça qui fonctionne :
if [[ $COUNT < $SEUIL ]]
Je suis aussi en bash. (les -gt et -lt passent)
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
12 avril 2010 à 16:37
((STATUS+1))
ça incrémente STATUS ça ?

Voui voui, ça marche chez moi ;-))

Pour les doubles crochets aussi ;-))
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
12 avril 2010 à 16:59
pas chez moi. Donc dans le doute conseillon à lebenator ((STATUS+=1))
0
Merci jipicy

les changements ont été effectué et malgrès cela, il reste les mêmes erreurs + la variable STATUS qui à une valeur nulle dans la boucle while après son incrémentation.

apparation de ce message d'erreur :

script.sh: line 118: [: -gt: unary operator expected
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
12 avril 2010 à 16:25
Quel shell ?

Chez moi avec un shell bash, ça passe sans problème ;-\
0
GNU bash, version 3.00.15(1)-release (i386-redhat-linux-gnu)
Copyright (C) 2004 Free Software Foundation, Inc.

pour la version !
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
12 avril 2010 à 16:33
Essaie comma ça alors :

STATUS=$((STATUS + 1))
0
après le changement :
la valeur de STATUS change bien dans le while
sortie du while elle vaut 0
-> incompréhensible car j'ai d'autres scripts utilisant le même type d'analyse de fichiers de log et lorsque la variable change dans le while je peux m'en servir avec la valeur qu'elle a prise dans celui-ci, là je bloque !
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
12 avril 2010 à 16:41
Affiche l'intégralité de ton script si possible...

Ta boucle "while" est elle exécutée par un shell fils ?
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
12 avril 2010 à 17:11
essayer
cat $FILE | (while read line
do
...
...
echo FIN )
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ca marche avec exec !

Par contre toujours un message d'erreur sur la première itération
-gt: unary operator expected et ce pour chaque ligne, le plus étonnant c'est que malgrès l'erreur il rentre bien dans la condition !

Maintenant reste à comprendre pourquoi ca fonctionne sans problème sur mes autres scripts alors que sur celui-ci je dois me pencher un peu plus sur ce problème de parent fils sans doute et il y aura peut etre des modifications a apporter à l'ensemble des scripts mis en place.

Merci beaucoup jipicy pour la qualité de tes réponses !
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
13 avril 2010 à 09:28
Essaie en quotant tes variables :

if [ "$COUNT" -gt "$SEUIL" ]

Ou avec les doubles crochets :

if [[ $COUNT -gt $SEUIL ]]
0
oui bha j'ai testé les doubles crochets, j'avais eu le problème plusieurs fois et ca le résoud très bien, par contre si t'as une explication je suis preneur !
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
13 avril 2010 à 10:15
Les doubles crochets permettent de s'affranchir des quotes, quasi obligatoires avec des simples crochets pour éviter les erreurs dues à des variables vides ou à des espaces.
Disons qu'ils sont plus permissifs avec des syntaxes laxistes ;-)
0
j'aime bien le terme de syntaxe laxiste, comme quoi faut que je bosse encore mon unix ;-} !
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
13 avril 2010 à 10:26
peut-être tes autres scripts utilisent
while read line
do
..
done < $FILE
plutot que
cat $FILE | while read line
do
..
done
0
et c'est exactement ça en plus.... je redirige vers des fichiers et j'extraie le resultat du fichier plutot que de l'incorporer dans une variable, je sais pas si y a un comportement plus judicieux entre les deux...
si quelqu'un à une idée merci de partager son savoir !
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié par dubcek le 13/04/2010 à 12:28
tu peux mettre les sorties d'une commande directement dans une variable
var=$(commande)
créer un fichier permet d'accéder ces données depuis d'autres scripts ou commandes et de les conserver
tu peux faire les 2 en même temps
var=$(commande | tee fichier)
0