Lecture de fichier sous unix

LEBENATOR -  
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 :

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

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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
    1. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
       
      ((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
    2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      ((STATUS+1))
      ça incrémente STATUS ça ?

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

      Pour les doubles crochets aussi ;-))
      0
    3. Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 331
       
      pas chez moi. Donc dans le doute conseillon à lebenator ((STATUS+=1))
      0
  3. LEBENATOR
     
    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
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Quel shell ?

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

      pour la version !
      0
    3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Essaie comma ça alors :

      STATUS=$((STATUS + 1))
      0
    4. LEBENATOR
       
      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
    5. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Affiche l'intégralité de ton script si possible...

      Ta boucle "while" est elle exécutée par un shell fils ?
      0
  4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    essayer
    cat $FILE | (while read line
    do
    ...
    ...
    echo FIN )
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. LEBENATOR
     
    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
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Essaie en quotant tes variables :

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

      Ou avec les doubles crochets :

      if [[ $COUNT -gt $SEUIL ]]
      0
    2. LEBENATOR
       
      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
    3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      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
    4. LEBENATOR
       
      j'aime bien le terme de syntaxe laxiste, comme quoi faut que je bosse encore mon unix ;-} !
      0
  7. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    peut-être tes autres scripts utilisent
    while read line
    do
    ..
    done < $FILE
    plutot que
    cat $FILE | while read line
    do
    ..
    done
    0
    1. LEBENATOR
       
      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
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      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