Re: fonction multigrep
Jean-Albert Ferrez wrote: #!/bin/bash [ $# -lt 2 ] \ { echo Usage: $0 \quoted list of strings to match\ [files]...; exit; } names=$1 shift foobar=$* for i in $names ; do foobar=`grep -l $i $foobar` || exit done echo $foobar | tr \ \\n Ce qui nous rapproche, il me semble, d'une solution utilisant awk à laquelle j'ai vaguement pensé, et qui éviterait le lancement de trop de processus, et c'est un peu plus léger, a priori, que lex et yacc. UNIX, j'arrête quand je veux. Encore une fois, attention aux météorites. -- Paul-Jean Cagnard Gianna Nannini, pourquoi tant de N ? -- http://www-internal.alphanet.ch/linux-leman/ avant de poser une question. Ouais, pour se désabonner aussi.
Re: fonction multigrep
Pourquoi faire si compliqué ? :p cat toto.txt | grep -e blabla -e super -e ca marche @++ JC
Re: fonction multigrep
On Fri, 11 May 2001, you wrote: grep matrix\|norm $(grep -l norm $(grep -l matrix *.java)) En y reflechissant bien, on peut encore simplifier : grep -E '(matrix.*norm)|(norm.*matrix)' *.java Voilà, j'arrive un peu tard... T'as pas une version LaTeX :-) Daniel -- http://www-internal.alphanet.ch/linux-leman/ avant de poser une question. Ouais, pour se désabonner aussi.
Re: fonction multigrep
... Il esxiste bien une solution mais c'est vraiment le canon a mouche ! Lex Yacc (Je sais je suis un peu marsien sur les bords...). Bien que connaissant ces deux (magnifiques) outils, les utiliser pour ce genre de script releve un peu du probleme psychiatrique. A moins que tu n'aies a effectuer ce genre de tache dans des delais tres courts. C'est a dire sur une tres grande quantite de donnee et tres frequement. La, on abandonne les scripts pour passer au C. Tu vois le probleme... Vue le problème des permutations il me semble que quelque chose comme ce qui suit (en bash ou c ou ...) peut servir. for f in (files2check); do for e in (expressions2lookfor); do grep -q $e $f) || (abort=1 break) done; if ($abort = 0) then echo $f done; à moins d'erreurs de syntaxe. -- http://www-internal.alphanet.ch/linux-leman/ avant de poser une question. Ouais, pour se désabonner aussi.
Re: fonction multigrep
On Thu, May 10, 2001 at 11:40:58AM +0200, claude wrote: Bonjour est-ce qu'il existe une possibilité avec grep (ou un autre outil) de rechercher plusieurs patterns dans une liste de fichiers ? par exemple je voudrais pouvoir écrire qqchose comme grep matrix and norm *.java et simplement: cat *.java | grep matrix | grep norm ca joue pas? pour retouver tous les fichiers *.java du répertoire courant qui contiennent les patterns matrix ET norm dans n'importe quel ordre d'apparition et pas forcément proche l'un de l'autre... Avec les expression régulière je sais faire la fonction OU mais pas le ET. Bien entendu c'est assez simple avec 2 patterns, mais ça explose quand on veut en chercher 4 , 5 ou plus ... est-ce qqun peut me donner une piste (genre RTFM avec un indice sur le nom de la doc à lire) ? merci d'avance claude P.S. en déséspoir de cause j'ai écrit un petit programme python pour faire cela, mais il prend vraiment trop de temps... -- http://www-internal.alphanet.ch/linux-leman/ avant de poser une question. Ouais, pour se désabonner aussi. -- Philippe Strauss http://philou.ch/ L'indifférence est le plus grand risque de notre temps, la forme civilisée de la cruauté. -- Zenta Maurina -- -- http://www-internal.alphanet.ch/linux-leman/ avant de poser une question. Ouais, pour se désabonner aussi.
Re: fonction multigrep
On Thu, May 10, 2001 at 11:40:58AM +0200, claude wrote: Bonjour est-ce qu'il existe une possibilité avec grep (ou un autre outil) de rechercher plusieurs patterns dans une liste de fichiers ? par exemple je voudrais pouvoir écrire qqchose comme grep matrix and norm *.java plutot grep matrix *.java | grep norm | sed -e s/\:.*$//g | sort | uniq pour faire joli, ca te retournera la liste des fichier java contenant matrix et norm dans la porte d'un fichier. grep applique a une liste de fichier retourne ses resultats en indiquant le nom du fichier en debut de ligne, derriere un double point ':' le sed sert a ne conserver que ce nom de fichier (pas sur de l'utilite du backslash par contre). a+ -- Philippe Strauss http://philou.ch/ L'indifférence est le plus grand risque de notre temps, la forme civilisée de la cruauté. -- Zenta Maurina -- -- http://www-internal.alphanet.ch/linux-leman/ avant de poser une question. Ouais, pour se désabonner aussi.
Re: fonction multigrep
Philippe Strauss a écrit : On Thu, May 10, 2001 at 11:40:58AM +0200, claude wrote: Bonjour [...] plutot grep matrix *.java | grep norm | sed -e s/\:.*$//g | sort | uniq je me suis surement mal expliqué (et peut-être aussi que je ne comprends pas cette solution), mais les deux patterns ne sont pas forcément sur la même ligne, mais ils peuvent être très éloignés l'un de l'autre... or, du moins sur ma version de linux, avec ce type de solution je n'attrape que les fichiers ou les deux patterns sont sur la même ligne... mais merci de votre aide claude -- http://www-internal.alphanet.ch/linux-leman/ avant de poser une question. Ouais, pour se désabonner aussi.
Re: fonction multigrep
On Thu, 10 May 2001, Philippe Strauss wrote: grep matrix *.java | grep norm | sed -e s/\:.*$//g | sort | uniq Malheureusement ceci ne retournera que les fichiers qui ont matrix et norm sur la même ligne. Et il nous faut: [ ... ] retouver tous les fichiers *.java du répertoire courant qui contiennent les patterns matrix ET norm dans n'importe quel ordre d'apparition et pas forcément proche l'un de l'autre... Idée 1: (utilisation d'un fichier temporaire, bien regarder où on le met, sinon attaque symlink, etc) grep -l matrix *.java | sort $TMP_FILE grep -l norm *.java | sort | join $TMP_FILE - rm $TMP_FILE Idée 2: grep -l matrix *.java | xargs grep -l norm Aide: - l'option -l affiche (sur la sortie standard) les fichiers qui contienne le motif - join peut faire une opération similaire à la jointure d'une base de données relationnelles - xargs exécute son argument avec comme paramètre tous les textes en entrée standard, en s'arrangeant pour que la limite de ligne de commande soit respectés (en lançant plusieurs commandes si nécessaires). NB: dans l'idée 1 on peut continuer avec autant de modifs que nécessaire si on met la sortie du join dans $TMP_FILE_2 puis qu'on renomme en $TMP_FILE. Dans l'idée 2, ajouter autant de | xargs que nécessaire. L'idée 1 est strictement séquentielle, l'idée 2 introduit une parallélisation qui limitera, à long terme, l'efficacité. -- http://www-internal.alphanet.ch/linux-leman/ avant de poser une question. Ouais, pour se désabonner aussi.
Re: fonction multigrep
On Thu, 10 May 2001, you wrote: Bonjour est-ce qu'il existe une possibilité avec grep (ou un autre outil) de rechercher plusieurs patterns dans une liste de fichiers ? par exemple je voudrais pouvoir écrire qqchose comme grep matrix and norm *.java Au pire cat *.java | sed -n -e '/matrix/p' -e '/norm/p' | sort | uniq Je sais, c'est pas beau :-) Daniel -- http://www-internal.alphanet.ch/linux-leman/ avant de poser une question. Ouais, pour se désabonner aussi.
Re: fonction multigrep
On Thu, May 10, 2001 at 02:53:19PM +0200, Daniel Cordey wrote: cat *.java | sed -n -e '/matrix/p' -e '/norm/p' | sort | uniq Aller, encore un p'tit pour la route. egrep matrix|norm *.java -- Francois Deppierraz [EMAIL PROTECTED] Nimag Networks Sàrl - www.nimag.net Phone +41 21 847 00 75 - Fax +41 21 847 00 77 PGP Key ID: 9D283BC9 -- http://www-internal.alphanet.ch/linux-leman/ avant de poser une question. Ouais, pour se désabonner aussi.
Re: fonction multigrep
On Thu, May 10, 2001 at 04:49:51PM +0200, Daniel Cordey wrote: On Thu, 10 May 2001, you wrote: Aller, encore un p'tit pour la route. egrep matrix|norm *.java Je suis c... j'aissayais de faire ca avec 'grep' croyant que les eregexp etaient incluses de maniere standard... mais le fin mot de l'histoire est que l'usage de 'egrep' est obsolete. Il faut le remplacer par 'grep -E' voui mais meme les regexp etendue n'ont pas d'operateur AND, la barre verticale signifie un OU logique, donc cette regexp matchera (oh le bo mot) aussi pour un fichier ne contenant qu'une des deux partie de la regexp, par exemple 'matrix'. l'utilisation du du shell est je trouve la plus jolie des solutions, celle de Jean-Albert Ferrez. Bravo Francois ! Daniel -- http://www-internal.alphanet.ch/linux-leman/ avant de poser une question. Ouais, pour se d?sabonner aussi. -- Philippe Strauss http://philou.ch/ L'indifférence est le plus grand risque de notre temps, la forme civilisée de la cruauté. -- Zenta Maurina -- -- http://www-internal.alphanet.ch/linux-leman/ avant de poser une question. Ouais, pour se désabonner aussi.
Re: fonction multigrep
Philippe Strauss a écrit : voui mais meme les regexp etendue n'ont pas d'operateur AND, la barre verticale signifie un OU logique, donc cette regexp matchera (oh le bo mot) aussi pour il me semblait aussi, c'est d'ailleurs par là que mes probs ont commencés :) un fichier ne contenant qu'une des deux partie de la regexp, par exemple 'matrix'. l'utilisation du du shell est je trouve la plus jolie des solutions, celle de Jean-Albert Ferrez.$ mais merci quand même à tous pour vos conseils... je constate juste qu'il n'y a pas de solution standard (canonique dirait mon mentor)... si vous le permettez et si ça peut rendre service à qqun, je vous joint ici le petit programme python que j'ai écrit... ATTENTION, c'est juste un premier jet... faudrait voir à faire les choses un peu plus proprement si on voulait vraiment l'utiliser... ###--- multigrep.py --- # /usr/bin/python import fileinput, sys, string usage = Usage : python multigrep.py #patterns pattern_1 .. pattern_n files #pattern nombre de patterns de recherche pattern_k les différents patterns séparés par des espaces files la liste des fichiers à examiner if len(sys.argv) 3 : print usage; ##print sys.argv n = int(sys.argv[1]); searchterms, sys.argv[1] = sys.argv[2:2+n],sys.argv[2+n:]; filelist = sys.argv[1]; ##print searchterms; try : for searchterm in searchterms: ##print filelist; if len(filelist) : ##print search term : ,searchterm; sys.argv[1:] = filelist[:]; ##print sys.argv[1]; filelist = []; for line in fileinput.input(): if (string.count(line, searchterm)) : if not (fileinput.filename() in filelist) : filelist = filelist + [fileinput.filename()]; ##print filelist = ,filelist, \n\n; except IOError: print usage; else : for file in filelist : print file; ###--- multigrep.py --- merci encore et bonne soirée claude -- http://www-internal.alphanet.ch/linux-leman/ avant de poser une question. Ouais, pour se désabonner aussi.
Re: fonction multigrep
On Thu, 10 May 2001, claude wrote: ###--- multigrep.py --- hum, sans être sectaire, au vu de ce que ça donne, je préfère encore la dernière solution de JAF :) -- http://www-internal.alphanet.ch/linux-leman/ avant de poser une question. Ouais, pour se désabonner aussi.