Forum Linux.débutant Shell : besoin de faire une boucle :(

Posté par  .
Étiquettes : aucune
0
19
juil.
2006
Bonjour a tous!

Ce que je demande doit etre d'une nullité absolue, mais j'ai vraiment besoin de votre aide

J'ai plusieurs fichiers (fich1, fich2,...fichn )contenant des sections de ce type :

Tue Jul 18 18:23:41 2006
ACTION : 'select * from demande where no_demande='D0605:0291''
DATABASE USER: '/'
PRIVILEGE : SYSDBA
CLIENT USER: oracle
CLIENT TERMINAL: pts/2
STATUS: 0

L'idée est d'obtenir le nom du fichier ainsi que la valeur de CLIENT USER, de comparer cette derniere valeur et me l'afficher à l'écran si elle ne correspond pas à la condition.
Je récupère bien le nom du fichier et la valeur de CLIENT USER dans une variable (je peux le mettre aussi dans un fichier, mais je ne sais pas la parcourir pour faire mon test)
valeur=`grep 'CLIENT USER' *.aud | cut -d ':' -f 1,3`
echo $valeur donne :
fich1: oracle
fich1: oracle
fich2: oracle

Merci d'avance
  • # Boucle for

    Posté par  (site web personnel) . Évalué à 4.

    La boucle la plus simple en shell est la boucle for :

    for fichier in fich*
    do
    echo $fichier
    done


    Ensuite tu peux faire ton grep à la place tu echo.
    Tu peux aussi mettre toute instruction entre `` a la place de fich* pour trouver tout ce que tu veux, pratique pour utiliser un find ou pour faire un seq 1 10
    • [^] # Re: Boucle for => Alternative en while

      Posté par  . Évalué à 3.

      Bonjour,

      Une suggestion en boucle while:
      ===
      grep 'CLIENT USER' *.aud | cut -d ':' -f 1,3 | \
      while read nom valeur; do
      echo "nom='${nom}' valeur='${valeur}'"
      done
      ===
      cela permet d'extraire les informations (ici on aura nom de la forme 'fich#:', et valeur='oracle').
      Si besoin, nettoyer le nom du caractère ":" final...

      Ainsi, dans la boucle du while, il sera possible de faire des tests pour chaque "ligne".

      Cdlt,
      • [^] # Re: Boucle for => Alternative en while

        Posté par  (site web personnel) . Évalué à 3.

        pourquoi
        gawk -F ':' '{ if ( $2 != "tata" ) print FILENAME ": " $2 ; }' *.aud

        ne fonctionne-t-il pas ? (au pire utilise awk mais bon c'est limité à 3000 caractères dans mon [mauvais] souvenir)
        • [^] # Re: Boucle for => Alternative en while

          Posté par  . Évalué à 4.

          Je trouve ceci plus élégant, mais le résultat est le même:

          gawk -F ':' ' $2 != "tata" { print FILENAME ": " $2 ; }' *.aud
          • [^] # Re: Boucle for => Alternative en while

            Posté par  (site web personnel) . Évalué à 2.

            rho il manque le /CLIENT USER/ après le ' et le 1er { de ma commande (la tienne sort toutes les lignes n'ayant pas tata...)
            • [^] # Re: Boucle for => Alternative en while

              Posté par  . Évalué à 1.

              Merci à vous tous pour votre aide!
              Je pense que je vais m'attarder sur la boucle while.
              Il ne me reste plus qu'a personnaliser mon petit script pour m'envoyer un mail à la fin du traitement
              Une derniere question J'ai rajouté un pipe dans ma commande principale, ce qui donne maintenant :
              grep 'CLIENT USER' ora*.aud | egrep -v '(PBertrand|JDenis,oracle)' | cut -d ':' -f 1,3 | sort | uniq

              Est ce une bonne chose de faire autant de pipe dans une commande ?
              • [^] # Re: Boucle for => Alternative en while

                Posté par  (site web personnel) . Évalué à 2.

                Est ce une bonne chose de faire autant de pipe

                ta vie sexuelle ne nous regarde pas
              • [^] # Re: Boucle for => Alternative en while

                Posté par  . Évalué à 2.

                re-Bonjour,

                La succession de commande "pipées" est une fonctionnalité très pratique (jusqu'à les faire en ligne de commande, à la volée ^__^) mais tout dépend du besoin.
                L'enchaînement ne devrait pas poser de problème mais augmentera plus ou moins la "charge" de la machine avec plusieurs processus (au moins un par commande lancée, à priori le max dépendra du nombre de traitements lancés dans la boucle while), chacun et sa mémoire nécessaire, etc...
                En outre, pour la relecture, ce n'est pas forcément le meilleur "format" car il est difficile de commenter à l'intérieur de l'enchaînement des commandes.... (la documentation du script, SVP !).
                En terme de performances, je ne peux que conseiller de mesurer et de comparer (par exemple via la commande "time") différentes solutions.
                Je soulignerais un point négatif concernant les erreurs qui surviennent en cours d'exécution des commandes "pipées" et qui ne sont pas alors forcément gérables dans le flot....

                Sinon, concernant le "sort | uniq", j'utiliserais "sort -u" comme alternative pour faire un tri et de retirer les doublons.
                Et, si possible, les solutions "awk(+sed)", "perl" & co: je dis OUI :-)

                Bon courage !

                Cdlt,

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.