[commande grep] question simple

Bonjour,

Je souhaite faire une recherche, par exemple sur le mot "content" mais je ne veux pas retrouver le mot "mecontent" je voudrais qu il recherche exactement ma requete.
Comment dois-je faire?

Merci

17 réponses

  1. Contributeur
    Re d-bax :)

    Ta question initiale était imprécise, car tu n'indiquais pas celà.

    ... et tu réponds incomplètement à la question "qu'est-ce que tu cherches" car on irait plus vite si tu disais ce qu'il peut (doit) y avoir après le mot et/ou avant le mot : rien ? espace(s) ?, ponctuation (exemple : virgule, point), guillements, apostrophe, etc., pour que tu considères le résultat juste (visiblement celà fait partie de ta recherche, donc).

    On y verrait aussi un peu plus clair aussi si tu disais en quoi consiste ton fichier de départ (si c'est un texte avec des phrases, s'il a un format particulier comme celui de ton exemple, etc.).

    Aides nous un peu, stp.

    Dal
    1. Je suis nul en expression régulières mais je ferais un truc comme :
      cat fichier |grep `  content `

      ou bien
      cat fichier |grep content|grep [^mecontent]


      Il y a surement mieux.
      1. Modérateur
        Salut,

        Il faut utiliser "grep" avec l'option "-E" (pour considérer la chaine comme une expression régulière étendue), couplée au méta-caractère "\b" (la chaîne est ancrée à un mot), ce qui donne :
        cat fichier  |  grep -E '\bcontent\b'
        ;-)
        1. ni l un ni l autre ne marche :( . De plus content et mecontent c etait un exemple je ne veux pas les sorties "*content*"
          En effet en plus j execute ca dans un script csh donc avec les guillemets je sais pas comment faire
          -->
          echo "`cat file | grep content ??? "
          1. Contributeur
            Salut d-bax,

            Chez moi, grep a une option "-w", que le manuel décrit comme çà :

            -w, --word-regexp
            Select only those lines containing matches that form whole
            words. The test is that the matching substring must either be
            at the beginning of the line, or preceded by a non-word con-
            stituent character. Similarly, it must be either at the end of
            the line or followed by a non-word constituent character. Word-
            constituent characters are letters, digits, and the underscore.


            Avec cette option

            echo "mécontent" | grep -w content
            ne retourne rien

            echo "très content" | grep -w content
            retourne la ligne

            Il faut veiller à ce que tes variables d'environnement soient bien paramétrées (LC_ALL, LC_CTYPE, LANG) pour que grep s'y retrouve dans les caractères français (sinon les caractères accentués sont considérés comme non alphabétiques ou des caractères séparateurs).

            Dal
            1. Modérateur
              La preuve que ça marche :
              [jp@Mandrake tmpfs]$ cat fichier
              Je souhaite faire une recherche, par exemple sur le mot "content" mais
              je ne veux pas retrouver le
              mot "mecontent"
              je voudrais qu il recherche exactement ma requete, je me contenterai d'un exemple.
              
              [jp@Mandrake tmpfs]$ cat fichier | grep -E '\bcontent\b'
              Je souhaite faire une recherche, par exemple sur le mot "content" mais
              [jp@Mandrake tmpfs]$
              Sinon pour la syntaxe avec les guillemets, il faut encadrer la commande par des "quotes inversées" :
              echo " `cat fichier  |  grep -E '\bcontent\b' ` "
              ;-)
              1. J ai une erreur quand je fais echo " `cat fichier | grep -E '\bcontent\b' ` "
                -->
                grep: illegal option -- E
                Usage: grep -hblcnsviw pattern file . . .
                1. Modérateur
                  Essaye alors avec "egrep" à la place de "grep -E" :
                  echo "`cat fichier | egrep  '\bcontent\b'`"
                  ;-)
                  1. Plus d erreur avec le egrep mais par contre il me sort ausun resultat il ne retrouve plus rien cette fois . Aie je me casse la tete ... Help me please ...
                    1. Contributeur
                      hmm... je ne suis pas le seul à avoir l'option "-w" telle que décrite là :

                      http://www.commentcamarche.net/forum/affich-1361557#4

                      ... si ??

                      Dal
                      qui se sent seul tout à coup
                      1. Modérateur
                        Salut [Dal],

                        Désolé mais j'avais zappé ton message :-( (c'est un petit inconvénient du forum qui arrive quand on ne fais pas bien gaffe aux numéros des posts..)
                        Merci pour la précision ;-))

                        Mais non t'es pas tout seul, t'as juste était "zappé" un instant ;-DDDDD
                      2. Contributeur
                        @jipicy:DDDDD <--- content (sans grep, ni rien, et hop !)

                        Dal
                    2. le grep -w ne marche pas car il trouve par exemple --> "(content)"
                      si dans le fichier tu as
                      1-content
                      2-mecontent
                      3-(content)

                      alors la ligne 1 et 2 sera sortie ...
                      1. Contributeur
                        Salut d-bax,

                        Je pense que tu veux dire 1- et 3-.

                        C'est normal de grep -w sorte (content), car son algorithme détecte les "mots" en utilisant, pour les distinguer, notamment des caractères séparateurs qui dans la syntaxe d'une langue déterminée ne font pas partie de l'orthographe de mots du dictionnaire.

                        En français, lorsque tu mets un mot entre parenthèses, le mot reste le même.

                        Que veux-tu rechercher exactement ?

                        Dal
                        1. effectivement je voulais dire 1 et 3...

                          Je veux afficher les lignes d un fichier qui contiennent exactement le mot que je recherche , si ce mot est entre parenthese (ou carecteres speciaux) je ne veux pas qu il s affiche.
                          1. effectivement je voulais dire 1 et 3...

                            Je veux afficher les lignes d un fichier qui contiennent exactement le mot que je recherche , si ce mot est entre parenthese (ou carecteres speciaux) je ne veux pas qu il s affiche.
                            1. Justement il me semble que j ai bien repondu a ta question.
                              En pratique, je cherche le mot content, je peux aussi bien trouver dans ce fichier : content mecontent (content) "content" ,content>
                              je ne vais donc pas chercher toutes les possibilite qui existe ...

                              je veux chercher le mot content SEUL
                              exemple de fichier :
                              1- je suis content
                              2- content je suis
                              3- je suis mecontent
                              4- je suis pas (content)
                              5- je suis "content"
                              6- je suis -content*
                              ...
                              dans ce cas je veux que seul la ligne 1 de ce fichier soit affichee.
                              En fait faudrait que je puisse par grep dire :
                              tu sors le mot content quand il a un espace devant et derriere (attention devant ca veux rien dire si le mot est en debut de ligne)
                              1. Contributeur
                                Sur ton fichier d'exemple, la commande suivante renvoie ce que tu veux :

                                cat test.txt | grep -v "^.[0123456789]*- content " | grep " content "

                                Celà suppose que chaque ligne commence par un chiffre ou un nombre qui soit immédiatement suivi d'un tiret et d'un espace pour que l'exception "ca veux rien dire si le mot est en debut de ligne" soit prise en compte.

                                si tes lignes commencent par quelque chose d'arbitraire, mais que tu ne veux pas retenir les cas où elles commencent par un espace et par "content" ou par "content" sans espace avant, alors la ligne appropriée serait :

                                cat test.txt | grep -v "^ content " | grep " content "

                                Dal
                                1. merci pour votre aide je m en suis sorti avec l aide de awk.

                                  par chance toutes les lignes ou se trouve le mot "content" ont moins de 40 caracteres
                                  solution :
                                  cat fichier | grep content | awk 'length<40'
                                  1. Webmaster
                                    Mouais...

                                    Pas trés optimisé tout ça...
                                    Si tu dois lire ton fichier pour compter le nombre de caractéres des lignes ou se trouvent "content" c'est un peu idiot de ne pas prendre un stylo et de les marquer a ce moment là ;)

                                    Un truc comme:
                                    cat fichier| tr -s ' ' | grep -e "[^\^] content\(\ \|\$\)"
                                    ne ferai t-il pas l'affaire?( à tester)

                                    On cherche quelque content précédé d'un espace non précédé d'un debut de ligne, et suivi soit d'un espace, soit d'une fin de ligne.
                                    Le tout en ayant pris soin de supprimer les éventuels espaces doubles.

                                    ++
                                  2. Ca c est sur que l on peut surement optimiser ma solution n est pas terrible.

                                    Mais la tienne ne fonctionne pas non plus :( -->

                                    1ere erreur : Variable name must contain alphanumeric characters
                                    il manque pas un numero d argument ici ?
                                    cat fichier| tr -s ' ' | grep -e "[^\^] content\(\ \|\$????\)"

                                    2ieme erreur : quand je met un n umero d argument
                                    grep: illegal option -- e

                                    :( !
                                  3. @d-bax
                                    cat fichier| tr -s ' ' | grep -e "[^\^] content\(\ \|\$????\)" 
                                    Le probleme se situe dans la modification que tu as fait de l'expression précédente.

                                    \(\ \|\$????\): Dans cette partie de l'expression, le \$ représente une fin de ligne et ne peut donc pas etre suivi de quoi que ce soit. Il b'est pas non plus forcément nécéssaire de l'échapper.

                                    Variable name must contain alphanumeric characters
                                    il manque pas un numero d argument ici ?
                                    La variable en question, telle que considérée par grep est: $????