Lecture de fichier sous unix

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. Modérateur
    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
    1. Modérateur
      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. Contributeur
        ((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. Modérateur
        ((STATUS+1))
        ça incrémente STATUS ça ?

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

        Pour les doubles crochets aussi ;-))
        0
      3. Contributeur
        pas chez moi. Donc dans le doute conseillon à lebenator ((STATUS+=1))
        0
    2. 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. Modérateur
        Quel shell ?

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

        pour la version !
        0
      3. Modérateur
        Essaie comma ça alors :

        STATUS=$((STATUS + 1))
        0
      4. 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. Modérateur
        Affiche l'intégralité de ton script si possible...

        Ta boucle "while" est elle exécutée par un shell fils ?
        0
    3. Contributeur
      essayer
      cat $FILE | (while read line
      do
      ...
      ...
      echo FIN )
      0
      1. 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. Modérateur
          Essaie en quotant tes variables :

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

          Ou avec les doubles crochets :

          if [[ $COUNT -gt $SEUIL ]]
          0
        2. 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. Modérateur
          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. j'aime bien le terme de syntaxe laxiste, comme quoi faut que je bosse encore mon unix ;-} !
          0
      2. Contributeur
        peut-être tes autres scripts utilisent
        while read line
        do
        ..
        done < $FILE
        plutot que
        cat $FILE | while read line
        do
        ..
        done
        0
        1. 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. Contributeur
          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