#1 Le 02/10/2008, à 21:50
- ChristopheCharron
[Partiellement Résolu]Récursivité de grep
Bonsoir,
voulant récupérer les adresses de courriels contenues dans de multiples fichiers, dans de multiples répertoires, j'ai tenté les commandes suivantes
find . -type f -print | xargs grep -iEo '[a-z\.0-9_-]{1,}@[a-z0-9_-]*\.[a-z]{2,4}' | sort -u > /tmp/adresses.txt | grep -iEo '[a-z\.0-9_-]{1,}@[a-z0-9_-]*\.[a-z]{2,4}' /tmp/adresses.txt | sort -u > /tmp/adresses_finales.txt
Mon fichier adresse.txt est bien renseigné, mais avec la mention des fichiers d'origine.
C'est pour cela que j'embraye sur la seconde recherche, pour ne récupérer que les adresses de courriel et les écrire dans le fichier adresses_finales.txt. Mais celui-ci reste désespérément vide.
J'imagine faire une grosse bourde, mais à force de fixer cette ligne, je ne vois plus rien ... alors d'avance, merci pour vos lumières.
Dernière modification par ChristopheCharron (Le 04/12/2008, à 09:21)
Cordialement,
Christophe Charron
http://xsoftware.fr
Hors ligne
#2 Le 02/10/2008, à 21:55
- best_friend_fr
Re : [Partiellement Résolu]Récursivité de grep
Salut
Ton sort -u > fichier
renvoie la sortie standard dans fichier, et donc rien ne passe dans grep.
Si tu veux garder les deux fichiers, remplaces
...| sort -u > /tmp/adresses.txt | ...
par
...|sort -u | tee /tmp/adresses.txt |...
sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr
Hors ligne
#3 Le 02/10/2008, à 21:56
- best_friend_fr
Re : [Partiellement Résolu]Récursivité de grep
En fait tu fais un fichier temporaire.
Il faut donc le faire en 2 commandes
sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr
Hors ligne
#4 Le 02/10/2008, à 22:15
- ChristopheCharron
Re : [Partiellement Résolu]Récursivité de grep
En fait tu fais un fichier temporaire.
Il faut donc le faire en 2 commandes
Question subsidiaire alors : n'est-il pas possible de ne pas faire de fichier intermédiaire et de ne le faire qu'en une seule commande ?
Cordialement,
Christophe Charron
http://xsoftware.fr
Hors ligne
#5 Le 02/10/2008, à 22:17
- best_friend_fr
Re : [Partiellement Résolu]Récursivité de grep
Essaye d'enlever les 2 references au fichier temporaire (et le signe > qui va avec)
sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr
Hors ligne
#6 Le 02/10/2008, à 22:20
- best_friend_fr
Re : [Partiellement Résolu]Récursivité de grep
Tu veux faire quoi exactement ?
sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr
Hors ligne
#7 Le 02/10/2008, à 22:23
- ChristopheCharron
Re : [Partiellement Résolu]Récursivité de grep
C'était juste pour faire plus "propre", en une seule ligne.
Balayer les fichiers d'un répertoire, en extraire les adresses de courriel et les mettre dans un fichier.
Mais ta proposition de saucissonner la ligne en 2 fonctionne bien quand même...
Cordialement,
Christophe Charron
http://xsoftware.fr
Hors ligne
#8 Le 02/10/2008, à 22:26
- best_friend_fr
Re : [Partiellement Résolu]Récursivité de grep
et pourquoi autant de grep et de sort ?
pourquoi pas un truc du genre
find . -type f -print | xargs cat | grep -iEo '[a-z\.0-9_-]{1,}@[a-z0-9_-]*\.[a-z]{2,4}' | sort -u > /tmp/adresses_finales.txt
sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr
Hors ligne
#9 Le 02/10/2008, à 22:29
- Alain.g
Re : [Partiellement Résolu]Récursivité de grep
Grep a une option -h qui permet de ne pas afficher le nom de fichier
Par ailleurs il existe l'option -r pour la recursivité
Xubuntu Karmic !
Hors ligne
#10 Le 03/10/2008, à 11:02
- ChristopheCharron
Re : [Partiellement Résolu]Récursivité de grep
Grep a une option -h qui permet de ne pas afficher le nom de fichier
Par ailleurs il existe l'option -r pour la recursivité
Excellent ...
grep -iEorh '[a-z\.0-9_-]{1,}@[a-z0-9_-]*\.[a-z]{2,4}' /home/moi/monsite/ | sort -u > /tmp/adresses_site.txt
Fait exactement ce que je veux en une ligne désormais très simple.
Merci beaucoup à vous.
Cordialement,
Christophe Charron
http://xsoftware.fr
Hors ligne
#11 Le 03/12/2008, à 10:14
- ChristopheCharron
Re : [Partiellement Résolu]Récursivité de grep
Bonjour,
je découvre que dans certains cas, l'adresse récupérée est tronquée.
Pour les adresses de type moncourriel@ici.la.fr, je récupère moncourriel@ici.la
ce qui me semble normal au vu du
\.[a-z]{2,4}
Comment construire une nouvelle expression pour d'éventuels "doubles" suffixes ?
En l'attente de vos avis éclairés.
Cordialement,
Christophe Charron
http://xsoftware.fr
Hors ligne
#12 Le 03/12/2008, à 17:43
- lolo888
Re : [Partiellement Résolu]Récursivité de grep
g pas testé mais je dirais
grep -iEorh '[a-z\.0-9_-]{1,}@[a-z0-9_-]*\.[a-z]{2,4}|[a-z\.0-9_-]{1,}@[a-z0-9_-]*\.[a-z0-9_-]*\.[a-z]{2,4}' /home/moi/monsite/ | sort -u > /tmp/adresses_site.txt
et on dit pas cascade mais récursive
Dernière modification par lolo888 (Le 03/12/2008, à 17:49)
Hors ligne
#13 Le 04/12/2008, à 09:20
- ChristopheCharron
Re : [Partiellement Résolu]Récursivité de grep
g pas testé mais je dirais
grep -iEorh '[a-z\.0-9_-]{1,}@[a-z0-9_-]*\.[a-z]{2,4}|[a-z\.0-9_-]{1,}@[a-z0-9_-]*\.[a-z0-9_-]*\.[a-z]{2,4}' /home/moi/monsite/ | sort -u > /tmp/adresses_site.txt
et on dit pas cascade mais récursive
Et je dis : Merci cela fonctionne
Cordialement,
Christophe Charron
http://xsoftware.fr
Hors ligne
#14 Le 06/12/2008, à 16:40
- ChristopheCharron
Re : [Partiellement Résolu]Récursivité de grep
Bonjour,
chaque jour amène son nouveau cas de figure ...
Comment gérer le cas suivant, pour lequel l'adresse de courriel est sur 2 lignes distinctes ?
Diagnostic-Code: X-Notes; User jean-francois.duchmol (jean-francois.d
uchmol@moncorrespondant.com) not listed in Domino Directory
Est-ce seulement possible ?
D'avance, merci pour vos lumières.
Cordialement,
Christophe Charron
http://xsoftware.fr
Hors ligne
#15 Le 06/12/2008, à 23:04
- Totor
Re : [Partiellement Résolu]Récursivité de grep
Bonsoir,
1er point : il est possible de simplifier ton expression.
'[a-z\.0-9_-]{1,}@[a-z0-9_-]*\.[a-z]{2,4}|[a-z\.0-9_-]{1,}@[a-z0-9_-]*\.[a-z0-9_-]*\.[a-z]{2,4}'
en
'[a-z\.0-9_-]+@([a-z0-9_-]*\.){1,2}[a-z]{2,4}'
2nd point : ton problème d'adresse fractionnée sur 2 lignes.
j'ai bien une solution à te proposer mais elle n'est pas fiable à 100%.
la voici : avant de rechercher les adresses, supprimer tous les retours à la ligne ainsi que toutes les fins de ligne dans les fichiers de sorte qu'un fichier ne soit représenté que par une seule ligne.
cela pourrait (je n'ai pas moyen de tester) donner quelque chose comme ceci :
find /home/moi/monsite/ -type f | xargs -L 1 cat |tr -d '\n'| tr -d '\r'|grep -iEo '[a-z\.0-9_-]+@([a-z0-9_-]*\.){1,2}[a-z]{2,4}' | sort -u > /tmp/adresses_site.txt
Alors, comme je l'indiquais, cette solution n'est pas fiable à 100%. En effet, si une adresse est complète sur une ligne, et que les 2 1er caractères de la ligne suivante appartiennent à l'ensemble [a-z\.0-9_-], alors l'adresse trouvée peut être faussée. Un exemple pour comprendre (ça ne fait pas de mal) :
textetextetexte adresse@domaine.fr
textetextetexte
tu obtiendras : adresse@domaine.frte
autre exemple erroné :
textetextetexte adresse@domaine.toto
textetexte.texte
résultat : adresse@domaine.tototextetexte.text
par contre, cet exemple est ok :
textetextetexte adresse@domaine.toto
textetextetexte
résultat : adresse@domaine.toto
donc bon... pour que cette méthode te garantisse le résultat, il faut impérativement que tes adresses soient encadrées/délimités dans tes fichiers par des caractères non inclus dans l'expression régulière (comme les parenthèses).
En espérant ne pas me tromper sur la commande et l'expression régulière (encore une fois, je ne peux pas tester) mais le principe est là
Dernière modification par Totor (Le 07/12/2008, à 21:02)
-- Lucid Lynx --
Hors ligne
#16 Le 07/12/2008, à 15:25
- ChristopheCharron
Re : [Partiellement Résolu]Récursivité de grep
Bonsoir,
1er point : il est possible de simplifier ton expression.
'[a-z\.0-9_-]{1,}@[a-z0-9_-]*\.[a-z]{2,4}|[a-z\.0-9_-]{1,}@[a-z0-9_-]*\.[a-z0-9_-]*\.[a-z]{2,4}'
en
'[a-z\.0-9_-]+@([a-z0-9_-]*\.){1,2}\.[a-z]{2,4}'
Peux-tu expliquer ?
2nd point : ton problème d'adresse fractionnée sur 2 lignes.
...
donc bon... pour que cette méthode te garantisse le résultat, il faut impérativement que tes adresses soient encadrées/délimités dans tes fichiers par des caractères non inclus dans l'expression régulière (comme les parenthèses).
...
Le problème est que je ne suis pas maître de la composition des fichiers. Et la méthode que tu proposes, me retournerai, d'expérience, plus de mauvaises adresses que de bonnes.
Mon espoir résidait en la possibilité d'intégrer dans une expression régulière l'équivalent de retour chariot, saut de ligne et autres joyeusetés de ce genre ...
Merci d'avoir pris le temps de me répondre.
Cordialement,
Christophe Charron
http://xsoftware.fr
Hors ligne
#17 Le 07/12/2008, à 16:06
- Totor
Re : [Partiellement Résolu]Récursivité de grep
Totor a écrit :Bonsoir,
1er point : il est possible de simplifier ton expression.
'[a-z\.0-9_-]{1,}@[a-z0-9_-]*\.[a-z]{2,4}|[a-z\.0-9_-]{1,}@[a-z0-9_-]*\.[a-z0-9_-]*\.[a-z]{2,4}'
en
'[a-z\.0-9_-]+@([a-z0-9_-]*\.){1,2}[a-z]{2,4}'Peux-tu expliquer ?
Ta "version" de l'expression signifiait : le texte doit correspondre à ce format [a-z\.0-9_-]{1,}@[a-z0-9_-]*\.[a-z]{2,4} ou à celui-ci [a-z\.0-9_-]{1,}@[a-z0-9_-]*\.[a-z0-9_-]*\.[a-z]{2,4}
Or, la seule chose qui diffère du 2nd format au 1er est [a-z0-9_-]*\. (après le @). Donc, [a-z0-9_-]*\. doit donc être présent 1 fois ou 2 dans l'adresse. Ce qui se traduit par le quantifieur {1,2} qui signifie l'expression qui précède doit être présente 1 fois ou 2.
Enfin, le quantifieur {1,} (avant le @) peut être remplacé par le signe + qui a la même signification.
Le problème est que je ne suis pas maître de la composition des fichiers. Et la méthode que tu proposes, me retournerai, d'expérience, plus de mauvaises adresses que de bonnes.
Mon espoir résidait en la possibilité d'intégrer dans une expression régulière l'équivalent de retour chariot, saut de ligne et autres joyeusetés de ce genre ...Merci d'avoir pris le temps de me répondre.
le problème d'intégrer un retour chariot où une fin de ligne dans l'expression est que cela a un impacte sur le dernier quantifieur {2,4} puisqu'il faut les prendre en compte et comme ça...je ne vois pas trop...je vais y réfléchir ...:rolleyes:
Dernière modification par Totor (Le 07/12/2008, à 21:02)
-- Lucid Lynx --
Hors ligne
#18 Le 07/12/2008, à 21:16
- Totor
Re : [Partiellement Résolu]Récursivité de grep
Bon, en fait, j'ai l'impression qu'il ne soit pas possible d'intégrer \n ou \r dans l'expression car grep compare l'expression régulière ligne par ligne du flux en entré. Donc pas moyen d'utiliser grep.
à voire avec sed ou awk si y'a moyen... (ou perl, python pour les adeptes)
Sinon, j'ai corrigé l'expression régulière que j'avais posté car il y avait un \. en trop.
Cela donne [a-z\.0-9_-]+@([a-z0-9_-]*\.){1,2}[a-z]{2,4} (et non [a-z\.0-9_-]+@([a-z0-9_-]*\.){1,2}\.[a-z]{2,4})
Enfin tr -d '\n'|tr -d '\r' peut-être remplacé par tr -d '\n-\r'
-- Lucid Lynx --
Hors ligne