BASH : Extraire nom utilisateur d'une @ mail

Résolu
ponpon27 Messages postés 38 Statut Membre -  
ponpon27 Messages postés 38 Statut Membre -
Bonjour,
De nouveau j'ai un probleme, jaimerais a partir d'un fichier ( toto) contenant des adresse mail du type prenom.nom@domaine, extraire simplment le user, prenom.nom, dans un 1er temps.

Parmis les prenom.nom qui me restera , il y aura des users avec une chaine de caractere bien specifique, du type XYZ que j'aimerais n epas conserver..autrement dit , j'aimerias supprimer les users contenant la chaine XYZ et ne garder que les autres users.

Voila , ce ci n'est qu'une etape bien sur, le but etant , une fois c'est users recuperés de pouvoir créer des comptes individuellement , pour chaque users extrait, par la commande htpasswd ...

Merci de votre aide
Configuration: Linux Mandriva
Firefox 1.5.0.7

17 réponses

  1. asevere Messages postés 13095 Date d'inscription   Statut Webmaster Dernière intervention   426
     
    Bonjour,

    Tu peux utiliser sed pour faire ce genre de manipulation.
    sed -n '/!XYZ/s/\(.*\)@.*/\1/p' toto
    
    -n        => Ne rien afficher
    /!XYZ/    => Ne traiter que les lignes ne contenant pas "XYZ"
    s/1/2/    => Substitution de 1 par 2
    \(.*\)@.* => Indique une chaine du type text1@text2 on enregistre text1 
                 (grace aux parenthèses)
    \1        => correspond au texte enregistré par la (première) paire de parenthèses
    Jette un oeil au manuel (man sed) pour plus d'informations! :)
    1
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    essaie comme ça alors :
    jp@MDK:~/tmpfs ssh$ cat plop
    arnaud.dupont@mondomaine.fr
    pierreXYZ.martin@mondomaine.fr
    
    jp@MDK:~/tmpfs ssh$ sed -e '/@/!d;{/XYZ/d; s/\(.*\)@.*/\1/}' plop
    arnaud.dupont
    jp@MDK:~/tmpfs ssh$
    ;-))
    1
  3. ponpon27 Messages postés 38 Statut Membre 1
     
    Rapide, concis, detaillé et expliqué!! merci bcp de ton aide
    0
  4. ponpon27 Messages postés 38 Statut Membre 1
     
    arff , fonctionne pas...

    exmple pour mon fichier toto, il pourrait contenir:
    arnaud.dupont@mondomaine.fr
    pierreXYZ.martin@mondomaine.fr

    j'aimerais avoir le rsultat suivant a l'ecran:
    arnaud.dupont

    lon enleve ce qu'il y a a partir de l'@ de dupont et la 2eme adresse n'est pas traitée puisqu'elle contient la chaine XYZ
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ponpon27 Messages postés 38 Statut Membre 1
     
    Genial ca marche! pourrias tu , a la maniere de asevere , expliquer un peu les differente etapes de cette comande stp?

    avec la 1ere solution proposée, j'ai deja bcp bcp progréssé, et merci dailleur asevere,, et la je crois qu'i y a moyen que je progresse encore!! lol

    merci a vous deux
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      sed -e    # pour enchainer plusieurs commandes à la suite
      '     
      /@/!d     # si les lignes ne contiennent pas d'@ les effacer
      ;         # séparateur de commandes
      {         # groupement de commande à appliquer aux lignes contenant un @
      /XYZ/d    # si les lignes contiennent "XYZ" les effacer
      ;        # séparateur de commandes
      s/\(.*\)@.*/\1/     # on récupère tout ce qui se trouve avant le @ et on substitue
                          #+ la ligne par lui même, le " \1"
      }         # fin du groupement de commandes
      '
      0
  7. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Re-

    J'y pense, si les adresses se trouvent sur une seule ligne (une adresse par ligne) et toutes en début de ligne, un simple :
     grep -o '.*@' plop | grep -v 'XYZ'
    devrait suffire ;-))
    0
  8. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    ou un coup de grep | sed
    grep -v XYZ fichier | sed -n 's/@.*//p'

    pas besoin de capturer le nom, ça suffit de supprimer à partir de @
    0
  9. asevere Messages postés 13095 Date d'inscription   Statut Webmaster Dernière intervention   426
     
    arg, autant pour moi, par fleme, je n'ai testé que sur une variable contenant XYZ et un autre ne contenant pas XYZ, en effet le résultat sur un fichier n'est pas correcte du tout...

    @+
    0
  10. asevere Messages postés 13095 Date d'inscription   Statut Webmaster Dernière intervention   426
     
    Bonche,

    Bah pour m'excuser d'avoir bourdé...
    awk 'BEGIN { FS = "@" } !/XYZ/{print $1}' toto
    
    BEGIN        => L'instruction suivante ne sera jouée que la première fois
    { FS = "@" } => Le separateur de champ est l'@
    !/XYZ/       => Recherche les lignes ne contenant pas (!) le motif XYZ
    { print $1 } => Affiche le champ 1
    Comme quoi, le solution sont multiples! :o)
    0
  11. ponpon27 Messages postés 38 Statut Membre 1
     
    et si je veux supprimer les lignes content cette fois non plus XYZ mais un caractere numerique je remplace XYZ par [0-9] ?
    0
  12. asevere Messages postés 13095 Date d'inscription   Statut Webmaster Dernière intervention   426
     
    Yop, tout juste :)
    0
  13. ponpon27 Messages postés 38 Statut Membre 1
     
    superbe boulot jipicy!! merci, c'est limpique comme explication
    0
  14. ponpon27 Messages postés 38 Statut Membre 1
     
    merci asevere...super sympa
    0
  15. TKouder Messages postés 5 Statut Membre 1
     
    Bonjour,
    voici une réponse d'un débutant comme moi mais ca marche et pas trop compliquée

    cut -d '@' -f 1 toto | grep -v XYZ
    0
  16. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    comme asevere l'a déjà dit Comme quoi, le solution sont multiples! :o)

    voici avec perl
    perl -ne '/XYZ/?0:s/@.*// and print' toto
    perl -ne 'next if /XYZ/;print if s/@.*//' toto

    0
  17. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Tout compte fait avec "sed" un simple :
    sed -n '/XYZ/! s/@.*//p' plop
    suffisait largement ;-))
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      suffisait largement ;-))
      Of, course ;-)
      je n'ai dit pas le contraire ;-))
      0
      1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898 > lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention  
         
        je n'ai dit pas le contraire ;-))
        J'ai jamais dit ça non plus, bien au contraire ;-))
        0
  18. ponpon27 Messages postés 38 Statut Membre 1
     
    merci a tous, cela marche bien!
    0