multiples grep

multiples grep - Shell/Batch - Programmation

Marsh Posté le 24-12-2003 à 15:25:40    

J'aimerai trouver un moyen en bash de faire :
grep toto test.txt > lignes_avec_toto.txt
grep titi test.txt > lignes_avec_titi.txt
grep tutu test.txt > lignes_avec_tutu.txt
mais en une seule ligne de commande et en lisant une seule fois le fichier test.txt.
J'ai bien essayé la commande "tee" ou la commande "xargs" mais je n'ai pas obtenu le resultat escompté.
 
Joyeux noel à tous.

Reply

Marsh Posté le 24-12-2003 à 15:25:40   

Reply

Marsh Posté le 24-12-2003 à 15:31:36    

je sais pas sous unix, mais en dos tu pourais faire un truc genre
 
for %i in (toto titi tutu) do grep %i test.txt > lignes_aves_%i.txt


---------------
On ne vit qu'une fois, mais pour qui sait vivre, une seule fois suffit (Merril Stubbing)
Reply

Marsh Posté le 24-12-2003 à 15:35:25    

grep -G "toto\|tata\|titi" test.txt > lignes.txt
 
edit : ah oui mais toi tu veux 3 fichiers de sorties ? si c'est l'cas, tu pourras pas faire ce que tu souhaites en lisant le fichier 1 seule fois je pense..


Message édité par *syl* le 24-12-2003 à 15:38:07
Reply

Marsh Posté le 24-12-2003 à 16:02:39    

pour bill.fr : on doit pouvoir le faire sous linux mais meme si ça tien en une ligne de commande je vais quand meme lire 3* mon fichier. (long quand tu l'applique sur un fichier de log de 15GO)
pour *Syl* :  oui j'aimerais la sortie dans 3 fichiers differents.
 
Merci pour ces reponse meme si ça ne correspond pas tous à fait à ce que je cherche.

Reply

Marsh Posté le 24-12-2003 à 17:02:01    

jame_s > tu sais, la ligne de bill.fr lit 3x le fichier également, c'est qu'une boucle for..

Reply

Marsh Posté le 25-12-2003 à 13:32:48    

oui c'est bien ce que je lui reproche meme si au depart c'etait une bonne idée


Message édité par jame_s le 25-12-2003 à 13:36:22
Reply

Marsh Posté le 05-01-2004 à 11:18:13    

awk est ton ami ;)
 
avec un truc du genre comme instruction :

/*tata*/ { print $0 > tata.txt }

Reply

Marsh Posté le 22-01-2004 à 14:40:15    

Voici un petit script awk qui devrait répondre à ton besoin.
Il permet de faire de faire l'équivalent de plusieurs greps avec un fichier en sortie par chaîne recherchée.
 
La syntaxe d'appel est :
 

mgrep list=[i]chaines[/i] output=[i]output_file_spec[/i] [i]inputfile ...[/i]


[i]chaines[/i] :

Liste de chaines de caractéres à rechercher séparées par une vurgule

[i]sortie[/i]  :

Spécification des fichiers de sortie (defaut=%i.out) dans laquelle les substitution suivantes sont effectuées :

         

%c = chaine trouvée

         

%i = indice dans la liste de la chaine trouvée

         

%f = nom du fichier d'entrée dans lequel la chaîne a été trouvée
 
Par exemple :
 

mgrep list=toto,lulu output=lignes_avec_%c.txt test.txt


On obtient les fichiers :
   lignes_avec_toto.txt
   lignes_avec_lulu.txt
Ces fichiers ne sont créés que si la chaine de correspondante a été trouvée.
Si une ligne comporte à la fois "toto" et "lulu", elle se retrouvera dans les deux fichiers.
 

Code :
  1. #!/usr/bin/awk -f
  2. NR == 1 {
  3.    if (list == "" )
  4.       exit 1;
  5.    split (list, aList, "," );
  6.    if (output  == "" )
  7.       output = "%i.out";
  8. }
  9. FNR == 1 {
  10.    Out_f = output;
  11.    if (FILENAME == "-" )
  12.       gsub("%f", "stdin",  Out_f);
  13.    else
  14.       gsub("%f", FILENAME, Out_f);
  15. }
  16. {
  17.    for ( ind in aList ) {
  18.       chaine = aList[ind];
  19.       if ($0 ~ chaine) {
  20.          Out_c = Out_f;
  21.          gsub("%i", ind,    Out_c);
  22.          gsub("%c", chaine, Out_c);
  23.          print $0 >> Out_c;
  24.       }
  25.    }
  26. }


 


---------------
Jean Pierre.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed