Re: fonction multigrep

2001-05-14 Par sujet Paul-Jean Cagnard

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

2001-05-14 Par sujet Jean-Claude Schopfer

Pourquoi faire si compliqué ? :p

cat toto.txt | grep -e blabla -e super -e ca marche

@++
JC


Re: fonction multigrep

2001-05-11 Par sujet Daniel Cordey

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

2001-05-11 Par sujet José Manuel Nunes

...
 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

2001-05-10 Par sujet Philippe Strauss

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

2001-05-10 Par sujet Philippe Strauss

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

2001-05-10 Par sujet claude

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

2001-05-10 Par sujet Marc SCHAEFER

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

2001-05-10 Par sujet Daniel Cordey

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

2001-05-10 Par sujet Francois Deppierraz

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

2001-05-10 Par sujet Philippe Strauss

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

2001-05-10 Par sujet claude

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

2001-05-10 Par sujet Marc SCHAEFER

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.