Extraction de chaines : grep, awk ???

Fermé
paques Messages postés 4 Date d'inscription jeudi 25 mars 2010 Statut Membre Dernière intervention 8 juillet 2010 - 25 mars 2010 à 17:47
 J-awk - 10 juin 2015 à 10:48
Bonjour,

je suis un peu nouveau en shell Unix, et je suis un peu perdu !

J'ai un besoin assez urgent :

j'ai un répertoire avec des fichiers,
.1 - je dois trouver quels fichiers contiennent une chaine de caractère (par exemple 'toto'),
.2 - je veux stocker la liste de fichiers dans un fichier que j'appelle liste
puis :
.3 - je veux extraire les lignes dans lesquelles j'ai trouvé la chaine 'toto' et les assembler dans un autre fichier que j'appelle sortie.


Donc je commence comme ça :
.1 et .2 : ça me donne les noms de fichiers puis ça les stocke dans liste
grep -il toto *.fic > liste 2>&1

J'ai donc isolé la liste de fichiers.
C'est pour le .3 que j'ai du mal.
Je voudrais mettre dans un tableau la liste de fichiers qui est dans liste,
puis pour chaque valeur du tableau (qui est donc le nom d'un fichier), utiliser la commande awk pour chercher les lignes contenant 'toto' et copier cette ligne et la suivante dans le fichier sortie


Auriez-vous une idée de ce qu'il faut écrire pour le .3 ?
Comment mettre les éléments de liste dans un tableau ?
Comment dire à awk de chercher 'toto' et de copier la ligne et la suivante dans sortie ?


Merci beaucoup pour votre aide.

2 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
25 mars 2010 à 18:33
Salut,

A quoi sert la 1ère partie, le fait de récupérer les noms de fichiers ?
C'est indispensable ?

Par ce que si au final c'est juste le fait de récupérer dans chaque fichier la ligne contenant "toto" et la ligna qui suit, "sed" peut faire ça en 2 temps 3 mouvements ;-))
0
paques Messages postés 4 Date d'inscription jeudi 25 mars 2010 Statut Membre Dernière intervention 8 juillet 2010
25 mars 2010 à 20:27
Indispensable non, mais j'aurai bien aimé.
Cela dit, c'est indépendant, ça peut rester comme ça et il peut y avoir une autre fonction qui fait le reste, non ?

Donc avec sed, je vais tester mais je ne connais pas encore cette fonction. Si tu peux me mettre sur la piste, je veux bien !

Merci
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
Modifié par jipicy le 25/03/2010 à 20:32
Re-

Avec "sed" :

sed -s -n '/toto/{N;p}' fich* > fichier_final


Sinon avec "grep" (et un soupçon de sed) :

grep -A1 -h 'toto' fich* | grep -v -- '--' > fichier_final

grep -A1 -h 'toto' fich* | sed '/--/d' > fichier_final
0
J-awk > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
10 juin 2015 à 10:48
Ou comment réduire une tache ou awk serait tout aussi bien adapté pour en faire des microtache moins adapté.

C'est pas pour rien que awk a été créé hein (remplacement de grep + sed)

Pour la petite histoire :

awk '/toto/{getline x; print FILENAME" : "$0" ; "x}' *.fic > fichier_final

fait 1, 2 et 3 en une seule ligne (et se permet de luxe de faire de la mise en page : j'ai mis les deux lignes sur une seule, mais tu peux utiliser 2 prints pour la même chose).


Tu peux aussi, pour faire le 1, 2 et 3, le rediriger dans deux fichier :

awk '/toto/{getline x; if(alreadyprint[FILENAME]!=1){print FILENAME > "liste ";alreadyprint[FILENAME]=1} print FILENAME " : "$0" ; "x > "fichier_final"}' *.fic


Et je trouve ça "plus simple" qu'un sed qui ne fait que la moitié ou qu'un mix sed + grep pour faire la totalité. (dsl pour le up, c'est mon coup de gueule du jour pour tout ceux qui veulent remplacer awk par des commandes SED parfois moins adapté)
0
paques Messages postés 4 Date d'inscription jeudi 25 mars 2010 Statut Membre Dernière intervention 8 juillet 2010
25 mars 2010 à 22:37
OK, c'est super sympa.
Je vais tester ça.

Merci jipicy
0