Lecture de fichier sous unix
LEBENATOR
-
dubcek Messages postés 18627 Date d'inscription Statut Contributeur Dernière intervention -
dubcek Messages postés 18627 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour à tous et merci du temps que vous allez consacrer à me répondre !
J'ai ce bout de code :
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
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
6 réponses
-
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 -
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 -
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-
-
-
-
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 ! -
-
-
essayer
cat $FILE | (while read line
do
...
...
echo FIN ) -
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 ! -
peut-être tes autres scripts utilisent
while read line
do
..
done < $FILE
plutot que
cat $FILE | while read line
do
..
done