Grep sur fichier volumineux

Résolu
userette -  
 userette -
Bonjour,
J'ai un fichier très volumineux à parcours.
Je voudrais que ma commande grep sorte à la première occurrence trouvée.
Sinon mon script mettrait des jours à se terminer puisque qu'il parcourt à chaque grep touuuuut le fichier.

je sais qu'il y a l'option grep -m NUMBER
mais elle est pas reconnue sur ma machine. peut etre ancienne version.

SVP aidez moi. je bloque la-dessous.
Configuration: Unix
Firefox 3.0.9

16 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    Tu peux afficher :
    grep --version
    grep --help
    Sinon avec "sed" :
    sed -n '/motif/p;q' fichier
    ;-))
    0
    1. userette
       
      merci pour ta réponse.
      j'ai essayé avec sed.
      ça me renvoie pas d'erreur sauf que ça ne me renvoie rien du tt.


      sed -n '/MOTIF/p;q' File

      alors que si je fais sed -n '/MOTIF/p' File --> ça me renvoie une ligne.

      aurais-tu une idée? est ce qu'il faut forcer l'affichage?
      0
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    C'est bizarre ça ;-\

    Et comme ça :
    sed -n '/MOTIF/{p;};q' File 
    ???
    0
    1. userette
       
      oui ça marche mais ça parcoure qd meme tout le fichier :(
      t'aurais pas une autre idée stp ?

      je bloque :(
      0
  3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    On peut avoir un bout de ton fichier et le motif à chercher please ?
    0
    1. userette
       
      bout du fichier :

      21621623335704|17|
      21621623336802|17|
      21621623351963|17|
      21621623357067|17|
      21621623373862|17|
      21621623376968|17|
      21621623390324|17|
      21621623391903|17|
      21622010039|14|
      21622010077|16|
      21622010191|36|
      21622010275|16|
      21622010352|16|
      21622010405|18|
      21622010547|14|
      21622010664|37|
      21622010692|17|
      21622010709|36|
      21622010720|17|
      21622010737|17|
      21622010822|37|
      21622010944|36|
      21622011017|14|


      le motif à chercher : 21622010039 par exemple.

      mon fichier contient 5366202 lignes. donc la recherche complete du fichier prend bcp de temps.
      0
  4. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Je t'avoue que je ne comprends plus ;-(((

    Avec ton exemple de fichier, effectivement il ne me renvoie rien avec "p;q" :
    [tmpfs]$ sed -n '/21622010039/p;q' plop
    [tmpfs]$ 

    Il me renvoie bien la ligne sans le "q" :
    [tmpfs]$ sed -n '/21622010039/p' plop
    21622010039|14|


    Par contre sur un autre fichier la commande "p;q" marche bien :

    [tmpfs]$ cat list.db
    toto 0123456789
    tata 0555555555
    titi 0677775555
    tutu 0123456789
    tete 0123456789
    bobo 0555555555
    baba 0987654321
    bibi 0555555555
    bubu 0123456789
    
    [tmpfs]$ sed -n '/01/p;q' list.db
    toto 0123456789
    [tmpfs]$ 
    Je ne comprends pas ;-(((((

    Désolé ;-(
    0
    1. userette
       
      j'ai essayé ton exemple.
      en fait, j'ai remarqué que avec sed -n '/01/p;q' list.db il recherche toujours ds la 1ere ligne et quit juste après.

      si tu essayait sed -n '/05/p;q' list.db pour voir


      stp ça m'aiderait bcp
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Effectivement avec une autre ligne que la 1ère ça marche plus ;-\

    Bon on va creuser le sujet ;-))
    0
  7. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Avec perl (j'ai fait un doublon pour tester - voir en gras)
    $ cat base
    21621623335704|17|
    21621623336802|17|
    21621623351963|17|
    21621623357067|17|
    21621623373862|17|
    21621623376968|17|
    21621623390324|17|
    21621623391903|17|
    21622010039|14|
    21622010039|14|
    21622010077|16|
    21622010191|36|
    21622010275|16|
    21622010352|16|
    21622010405|18|
    21622010547|14|
    21622010664|37|
    21622010692|17|
    21622010709|36|
    21622010720|17|
    21622010737|17|
    21622010822|37|
    21622010944|36|
    21622011017|14|
    $ perl -ne 'next unless /^(21622010039)/;print "ligne $. => $1\n"' base
    ligne 9 => 21622010039
    ligne 10 => 21622010039
    $ perl -ne 'next unless /^(21622010039)/;print "ligne $. => $1\n" and exit' base
    ligne 9 => 21622010039
    
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Salut lami20j,

      J'étais à 2 doigts de te demander une solution en Perl car apparemment avec "sed" ce n'est pas possible directement, à moins d'user de moulinettes contre productive ;-((

      Merci ;-)

      Sinon avec sed il faudrait connaitre au moins le contenu de la ligne suivante pour faire un truc du genre :
      $ sed -n '/21622010077/q;/21622010039/p' plop
      21622010039|14|
      Avec ça ça marche ;-))

      PS. Dommage quand même que le "grep -m 1" ne marche pas :
      $ grep -m 1 '21622010039' plop
      21622010039|14|
      ;-))
      0
      1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571 > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        Salut jipicy ;-)

        De rien ;-))
        0
  8. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    Et comme ça?!
    $ cat base
    21621623335704|17|
    21621623336802|17|
    21621623351963|17|
    21621623357067|17|
    21621623373862|17|
    21621623376968|17|
    21621623390324|17|
    21621623391903|17|
    21622010039|14|
    21622010039|14|
    21622010077|16|
    21622010191|36|
    21622010275|16|
    21622010352|16|
    21622010405|18|
    21622010547|14|
    21622010664|37|
    21622010692|17|
    21622010709|36|
    21622010720|17|
    21622010737|17|
    21622010822|37|
    21622010944|36|
    21622011017|14|
    $ while read ligne;do echo $ligne|grep 21622010039 && break;done <base
    21622010039|14|
    0
    1. userette
       
      salut à tous,
      merci pour toutes vos réponses.
      j'aime bien la solution en perl. sauf que je ne m'y connais pas trop en perl.

      lami20j, tu peux me dire comment j'extrais toute la ligne et non pas seulement le motif ??????

      21622010039|14|


      merciiiiiiiiiiiiii
      0
      1. userette > userette
         
        meme avec le while read ...... grep "" && break, ça marche. superrrrrrr

        vous me sauvez la vie :) :) :)
        0
  9. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Avec shell + grep
    while read ligne;do echo $ligne|grep -o 21622010039 && break;done <base

    En perl
    perl -ne 'next unless /^(21622010039)/;print "$1\n" and exit' base

    0
  10. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    hello
    et avec awk
    awk '/21622010039/ {print $0;exit} < fichier
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Salut,

      T'as pas oublié un apostrophe ? ;-)
      0
      1. userette > lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
         
        lami20j c'est encore moi. désolée d'être aussi pressante mais c pour un truc urgent.

        en fait, avec ta commande perl, je n'extrais que le motif. moi je voudrais toute la phrase.

        t'aurais pas une idée !!
        0
      2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571 > userette
         
        Re,

        Essaie
        perl -ne 'next unless /^21622010039/;print and exit' base
        --
        106485010510997108
        0
      3. userette > lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
         
        ok ça marche mnt sauf que si je mets ma commande dans un script :

        cat msisdn.txt | while read MSISDN
        	do
        		echo $MSISDN
        		result=`perl -ne 'next unless /^$MSISDN/;print and exit' base`
        		echo $result
        	done


        la commande marche mais ça me sort toujours la 1ere ligne du fichier base

        base :
        21622010039|14|
        21622010077|16|
        21622010191|36|
        21622010275|16|
        21622010352|16|
        21622010405|18|
        21622010547|14|
        21622010664|37|
        21622010692|17|
        21622010709|36|
        21622010720|17|
        


        msisdn.txt :
        21622010405
        21622010664


        bizarre !!!
        0
  11. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    effectivement
    awk '/21622010039/ {print $0;exit}' < fichier
    0
  12. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    for MSISDN in $(cat msisdn.txt)
    do
      echo $MSISDN
      result=$(perl -ne 'next unless /^$MSISDN/;print and exit' base)
      echo $result
    done

    Mais je ne comprends pas ce que tu veux.
    Comment ça la 1ère ligne?!

    Il faut que tu exécutes le script est affiche ici le résultat.
    Il faudra aussi que tu affiches ce que tu veux obtenir.

    En réalité, tu as posé une question pour un cas particulier, mais il s'avère que le problème doit être traiter de façon globale.

    On attends tes explications.
    0
    1. userette
       
      ok. j'ai essayé le code que tu as mis. mais j'ai toujours le même résultat non attendu, à savoir :

      21622010405
      21622010039|14|
      21622010664
      21622010039|14|


      ==> la commande renvoie toujours la 1ere ligne du fichier base


      alors que je veux avoir :
      21622010405
      21622010405|18|
      21622010664
      21622010664|37|


      ==> extraire les 1eres lignes relatives aux motifs que je recherche.

      any idea please ?
      merci
      0
  13. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    Tu testes quoi en fait? L'affichage de ton résultat ne suffit pas.

    Affiche le résultar de
    for MSISDN in $(cat msisdn.txt);do  echo $MSISDN;done


    0
    1. userette
       
      ah ok, j'avais pas compris.
      j'avais mis plus haut le contenu de mon fichier :
      21622010405
      21622010664
      0
  14. userette
     
    ok ça fonctionne mnt. j'ai juste remplacer les ' par les ". et bizarre ça marche mnt.
    le pb c'est que la recherche est tjrs aussi lente.
    je vais esaayer d'optimiser
    0
  15. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    Il peut avoir un conflit entre une variable shell et perl (je n'ai pas moyens de tester)

    Essaie plutôt (je n'ai pas testé)
    for MSISDN in $(cat msisdn.txt)
    do
      echo $MSISDN
      while read ligne
      do 
          echo $ligne|grep $MSISDN && break
      done < base
    done
    0
  16. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Dis-moi userette, tu peux essayer ça :
     sed '/21622010039/!d;q' fichier
    s'il te plait ;-))
    0
    1. userette
       
      oui ça marche mais ça ne me renvoie pas toute la ligne. que le 21622010039
      0
      1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > userette
         
        Encore une bizarrerie ;-((

        Essaie :
         sed '/21622010039.*$/!d;q'
        0
      2. userette > jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention  
         
        finalement,
        j'ai utilisé
        `perl -ne "next unless /^$chaine/;print and exit" base  >> output.txt`


        ça marche.
        merci à toi jipicy.

        merci à tous :))))
        0