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
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
A voir également:
- Lecture de fichier sous unix
- Fichier rar - Guide
- Fichier host - Guide
- Fichier iso - Guide
- Confirmation de lecture whatsapp - Guide
- Comment réduire la taille d'un fichier - Guide
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
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
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
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
12 avril 2010 à 15:40
Salut,
Parce que ton script est plein d'erreur de syntaxe ;-(
En gras les choses à changer ;-\
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
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
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)
ç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)
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
12 avril 2010 à 16:37
((STATUS+1))
ça incrémente STATUS ça ?
Voui voui, ça marche chez moi ;-))
Pour les doubles crochets aussi ;-))
ça incrémente STATUS ça ?
Voui voui, ça marche chez moi ;-))
Pour les doubles crochets aussi ;-))
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
12 avril 2010 à 16:59
pas chez moi. Donc dans le doute conseillon à lebenator ((STATUS+=1))
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
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
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
12 avril 2010 à 16:25
Quel shell ?
Chez moi avec un shell bash, ça passe sans problème ;-\
Chez moi avec un shell bash, ça passe sans problème ;-\
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
12 avril 2010 à 16:33
Essaie comma ça alors :
STATUS=$((STATUS + 1))
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 !
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 !
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
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 ?
Ta boucle "while" est elle exécutée par un shell fils ?
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
12 avril 2010 à 17:11
essayer
cat $FILE | (while read line
do
...
...
echo FIN )
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 !
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 !
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
13 avril 2010 à 09:28
Essaie en quotant tes variables :
Ou avec les doubles crochets :
if [ "$COUNT" -gt "$SEUIL" ]
Ou avec les doubles crochets :
if [[ $COUNT -gt $SEUIL ]]
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
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 ;-)
Disons qu'ils sont plus permissifs avec des syntaxes laxistes ;-)
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
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
while read line
do
..
done < $FILE
plutot que
cat $FILE | while read line
do
..
done
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
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)
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)