Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".

#26 Le 05/06/2011, à 08:56

Watael

Re : Extraire une chaine avec Grep...sed ...

salut,

while read line; do if [[ $line =~ .*\ ([^@]*@[^ ]*) ]]; then email="${BASH_REMATCH[1]/#[><-+,]}"; echo "${email/%[><-+,]}"; fi; done <<<"$test"
toto@gmail.com
leontine@yahoo.fr
titine@gmail.com
hgfhfg@yahoo.fr

eval, c'est mal.

Hors ligne

#27 Le 05/06/2011, à 16:10

aduxas

Re : Extraire une chaine avec Grep...sed ...

Wow.  Il faudra que j'étudie le manuel bash de plus près!  Watael pourrait utiliser [ <-+,] comme séparateur de début et [ >-+,] comme séparateur de fin d'adresse email au lieu d'un simple blanc.  Cependant:

J'ai essayé tout cela sur un fichier d'un million de lignes, contenant 70% de lignes avec email et 30% sans.

La méthode sed:  42.45s et 41.33s si je remplace les [:alnum:] avec @ et [^@]

La méthode pur bash Watael: 5:22.68s

J'ai tout fait deux fois pour éliminer des effets cache/tampons.  Qui explique?

EDIT: temps exact
EDIT compris blanc échap

Dernière modification par aduxas (Le 05/06/2011, à 16:25)

Hors ligne

#28 Le 05/06/2011, à 16:40

Watael

Re : Extraire une chaine avec Grep...sed ...

le man bash est clair : "Cet interpréteur de commandes est trop gros et trop lent."
c'est connu, sur des gros fichiers, il faut privilégier sed, awk, perl, python...

j'ai lu que c'est à cause d'algorithmes de lecture... je ne sais pas.


eval, c'est mal.

Hors ligne

#29 Le 28/12/2012, à 01:17

tontonlogic

Re : Extraire une chaine avec Grep...sed ...

Salut,

Je relève ce post pour ne pas éparpiller.


Pour butiner et extraire les email de tout un répertoire j'utilise:

strings /home/moi/monrepertoire/* |grep -Eiro '([[:alnum:]_.-]+@[[:alnum:]_.-]+?\.[[:alpha:].]{2,6})' ./ |uniq > emails.txt

Ca me sort bien les lignes dans mon fichier emails.txt.  Toutefois j'obtiens aussi le nom du fichier avant l'email.
Comment l'enlever? Les lignes ressemblent à ceci:

./monrepertoire/index.html:pierre@domaine.fr
./monrepertoire/index.html:paul@domaine.fr
./monrepertoire/index.html:jacques@domaine.fr

...

Hors ligne

#30 Le 28/12/2012, à 10:20

Haleth

Re : Extraire une chaine avec Grep...sed ...

Man grep:

-h, --no-filename
              Suppress the prefixing of file names on  output.   This  is  the
              default  when there is only one file (or only standard input) to
              search.


Ubuntu is an ancien African word which means "I can't configure Debian"

Because accessor & mutator are against encapsulation (one of OOP principles), good OOP-programmers do not use them. Obviously, procedural-devs do not. In fact, only ugly-devs are still using them.

Hors ligne

#31 Le 29/12/2012, à 01:39

tontonlogic

Re : Extraire une chaine avec Grep...sed ...

Merci, c'est mieux.

strings /home/moi/monrepertoire/* |grep -Ehiro '([[:alnum:]_.-]+@[[:alnum:]_.-]+?\.[[:alpha:].]{2,6})' ./ |uniq > emails.txt

Je rencontre encore deux problèmes: |uniq ne joue pas son rôle. J'obtiens plusieurs fois le même mail.  Et le dernier problème c'est que string cherche bien dans un premier temps dans le répertoire  /home/moi/monrepertoire/* puis sort de ce répertoire et cherche à la racine de mon disque. Une idée?

Hors ligne

#32 Le 29/12/2012, à 06:06

pingouinux

Re : Extraire une chaine avec Grep...sed ...

Bonjour,

tontonlogic #31 a écrit :

|uniq ne joue pas son rôle

Le fichier d'entrée doit être trié. Voici un extrait de man uniq :

Filter  adjacent  matching lines from INPUT (or standard input), writing to
       OUTPUT (or standard output).

       With no options, matching lines are merged to the first occurrence.

Ajouté : Que vient faire ./ à la fin de la commande grep ? grep va parcourir l'arborescence à partir du répertoire courant, mais ne va pas lire le résultat de strings.

Dernière modification par pingouinux (Le 29/12/2012, à 06:33)

Hors ligne

#33 Le 29/12/2012, à 14:29

Hizoka

Re : Extraire une chaine avec Grep...sed ...

remplace uniq par sort -u

Hors ligne

Haut de page ↑