Problème grep

Résolu
Bonjour,

j'ai un souci avec grep, qui ne trouve pas un motif existant :

toto="1 * * * * /home/thierry/cron.sh" && grep "$toto" /home/crontabs/site/spool/local/formation/thierry

Sachant que /home/crontabs/site/spool/local/formation/thierry contient bien la ligne "1 * * * * /home/thierry/cron.sh".

Par contre si je fais
toto=" * * * * /home/thierry/cron.sh" && grep "$toto" /home/crontabs/site/spool/local/formation/thierry
il me trouve bien :

1 * * * * /home/thierry/cron.sh

:-()
Configuration: Windows XP
Firefox 2.0.0.9

13 réponses

  1. Bonjour,

    Déjà, vérifie ta variable toto :

    echo $toto

    Il se peut que tes astérisques soient interprétées dans le cas où des fichiers existent dans le répertoire où tu as affecté la variable toto.

    Bonne investigation,

    c-moi
    1. Contributeur
      qu'affiche :
      toto="1 * * * * /home/thierry/cron.sh" ; echo $?
      toto="* * * * /home/thierry/cron.sh" : echo $?
      puisque que c'est ce que teste &&
      1. Modérateur
        Salut,
        toto="1 * * * * /home/thierry/cron.sh" && grep "${toto}" /home/crontabs/site/spool/local/formation/thierry
        ;-))
        1. Ben nan jipicy, pour une fois c'est pas ca :

          toto=" * * * * /home/thierry/cron.sh" && grep "${toto}" /home/crontabs/site/spool/local/formation/thierry
          1 * * * * /home/thierry/cron.sh

          toto="1 * * * * /home/thierry/cron.sh" && grep "${toto}" /home/crontabs/site/spool/local/formation/thierry
          => rien !

          :-()
          1. Modérateur
            Désolé j'ai pas eu le temps de tester ce matin, essaie ça, inspiré de la soluce plus bas donnéepar de ton collègue :
             grep "${toto//\*/\*}" fichier
            ;-))
        2. Contributeur
          et
          toto="0 * * * * /home/thierry/cron.sh" && grep "${toto}" /home/crontabs/site/spool/local/formation/thierry
          1. J'ajoute "0 * * * * /home/thierry/cron.sh" dans /home/crontabs/site/spool/local/formation/thierry puis :

            toto=" * * * * /home/thierry/cron.sh" && grep "${toto}" /home/crontabs/site/spool/local/formation/thierry
            1 * * * * /home/thierry/cron.sh
            0 * * * * /home/thierry/cron.sh

            toto="0 * * * * /home/thierry/cron.sh" && grep "${toto}" /home/crontabs/site/spool/local/formation/thierry
            => rien !
            1. Contributeur
              est-ce que c'est 1<espace> dans toto et 1<tab> dans le fichier ?
              cat -v /home/crontabs/site/spool/local/formation/thierry
              1. salut Thierrytte,

                il suffit de faire ça

                toto="1 \* \* \* \* /home/thierry/cron.sh" && grep "$toto" /home/crontabs/site/spool/local/formation/thierry

                explication:
                les étoiles sont interprété comme de 0 à n fois le caractère espace et non comme des étoiles.

                voila

                1. Bien joué ;-)

                  Là ou çà se complique, c'est que le contenu de ma variable $toto est issue d'un scan de fichier, dont je cherche les occurences de chaque ligne complète dans un autre fichier

                  Genre :

                  while read Ligne;do
                  grep "^$Ligne$" $Spool_Local/$Hosts/$Files || echo "$Ligne: Non trouvé"
                  done < $Spool_Distant/$Hosts/$Files

                  :-)
                  1. grep "${toto//\*/\*}" fichier ca fonctionne;

                    Mais est-ce que je ne risque pas encore de tomber sur d'autres caractères qui posent problème à part "*", en passant en variablechaque ligne de mon fichier source ?

                    PS: c'est quoi cette syntaxe sur grep ? c'est la première fois que je la vois !!!
                    1. Modérateur
                      PS: c'est quoi cette syntaxe sur grep ? c'est la première fois que je la vois !!!
                      C'est pas propre à "grep" mais au shell (bash en l'occurrence) et plus particulièrement à l'expansion des paramètres, voir "man bash" (entre autre le chapitre Expansion et sa section Remplacement des paramètres).
                  2. Ah ben c'était trop simple:

                    man grep

                    -F Interprète le motif comme une liste de chaînes
                    figées, séparées par des Sauts de Lignes (NewLine).
                    La correspondance est faite avec n'importe laquelle
                    de ces chaînes.

                    (ou fgrep)

                    Merci à tous !