[commande grep] question simple

d-bax -  
 chapo -
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. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    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
  2. epinard Messages postés 201 Statut Membre 27
     
    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.
    0
  3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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'
    ;-)
    0
  4. d-bax
     
    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 ??? "
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    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
    0
  7. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    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' ` "
    ;-)
    0
  8. d-bax
     
    J ai une erreur quand je fais echo " `cat fichier | grep -E '\bcontent\b' ` "
    -->
    grep: illegal option -- E
    Usage: grep -hblcnsviw pattern file . . .
    0
  9. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Essaye alors avec "egrep" à la place de "grep -E" :
    echo "`cat fichier | egrep  '\bcontent\b'`"
    ;-)
    0
  10. d-bax
     
    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 ...
    0
  11. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    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
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      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
      0
      1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        :DDDDD <--- content (sans grep, ni rien, et hop !)


        Dal
        0
  12. d-bax
     
    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 ...
    0
  13. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    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
    0
  14. d-bax
     
    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.
    0
  15. d-bax
     
    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.
    0
  16. d-bax
     
    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)
    0
  17. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    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
    0
  18. d-bax
     
    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'
    0
    1. asevere Messages postés 13095 Date d'inscription   Statut Webmaster Dernière intervention   426
       
      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.

      ++
      0
    2. d-bax
       
      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

      :( !
      0
      1. chapo > 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: $????
        0