Récupérer la fin d'un fichier perl
Résolu/Fermé
Maillon
Messages postés
156
Date d'inscription
mardi 4 octobre 2005
Statut
Membre
Dernière intervention
15 avril 2011
-
9 févr. 2009 à 11:51
Maillon Messages postés 156 Date d'inscription mardi 4 octobre 2005 Statut Membre Dernière intervention 15 avril 2011 - 10 févr. 2009 à 10:15
Maillon Messages postés 156 Date d'inscription mardi 4 octobre 2005 Statut Membre Dernière intervention 15 avril 2011 - 10 févr. 2009 à 10:15
A voir également:
- Récupérer la fin d'un fichier perl
- Comment réduire la taille d'un fichier - Guide
- Fichier rar - Guide
- Comment ouvrir un fichier epub ? - Guide
- Comment recuperer un message supprimé sur whatsapp - Guide
- Forcer la suppression d'un fichier - Guide
7 réponses
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
9 févr. 2009 à 13:30
9 févr. 2009 à 13:30
Salut,
Si tu as plusieurs fois dans le fichier biippp les choses se compliquent un peu.
Il faut préciser tous les détails pour trouver une solution pertinente.
Voici un exemple à tester. Pour le moment on ne récupère rien, on se content juste d'afficher.
106485010510997108
Si tu as plusieurs fois dans le fichier biippp les choses se compliquent un peu.
Il faut préciser tous les détails pour trouver une solution pertinente.
Voici un exemple à tester. Pour le moment on ne récupère rien, on se content juste d'afficher.
open F,"fichier.txt" or die "E/S : $!\n"; while(<F>){ print if /biippp/ .. eof(); }--
106485010510997108
Bonjour,
Quelque chose du genre ci-dessous devrait t'aider,
tu pourrais rajouter une variable pour la chaine recherchée afin de faciliter les changements,
l'exemple ci-dessous marche bien, je viens de le tester :
my @to_print=0;
open( IFILE, "<", "input_file.txt" );
open( OFILE, ">", "output_file.txt" );
while( $line = <IFILE> )
{
if ($to_print == 0)
{
if ($line=~/biippp/)
{
$to_print = 1;
print OFILE substr($line, index($line, 'biippp')+length('biippp'), length($line));
}
}
else
{
print OFILE $line;
}
}
close( IFILE );
close( OFILE );
Avec input_file.txt =
bla bla
bla bla
bla bla
bla bla
blabla biippp truc
important important
important importantimportant important
important important
==> on obtient output_file.txt =
truc
important important
important importantimportant important
important important
Bon courage.
Quelque chose du genre ci-dessous devrait t'aider,
tu pourrais rajouter une variable pour la chaine recherchée afin de faciliter les changements,
l'exemple ci-dessous marche bien, je viens de le tester :
my @to_print=0;
open( IFILE, "<", "input_file.txt" );
open( OFILE, ">", "output_file.txt" );
while( $line = <IFILE> )
{
if ($to_print == 0)
{
if ($line=~/biippp/)
{
$to_print = 1;
print OFILE substr($line, index($line, 'biippp')+length('biippp'), length($line));
}
}
else
{
print OFILE $line;
}
}
close( IFILE );
close( OFILE );
Avec input_file.txt =
bla bla
bla bla
bla bla
bla bla
blabla biippp truc
important important
important importantimportant important
important important
==> on obtient output_file.txt =
truc
important important
important importantimportant important
important important
Bon courage.
Maillon
Messages postés
156
Date d'inscription
mardi 4 octobre 2005
Statut
Membre
Dernière intervention
15 avril 2011
5
9 févr. 2009 à 14:42
9 févr. 2009 à 14:42
Merci nab je vais essayer ce que tu as fais pour voir si j'y arrive. :)
Pour répondre à ta question lami20j, biippp n'est qu'une fois dans le fichier et il me faut tout ce qui est après.
Et nab est ce que tu pourrais m'expliquer exactement ce que tu as fais parce que j'ai quand même envie de comprendre (ya pas que le résultat qui m'intéresse :) )
Pour répondre à ta question lami20j, biippp n'est qu'une fois dans le fichier et il me faut tout ce qui est après.
Et nab est ce que tu pourrais m'expliquer exactement ce que tu as fais parce que j'ai quand même envie de comprendre (ya pas que le résultat qui m'intéresse :) )
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
9 févr. 2009 à 15:05
9 févr. 2009 à 15:05
Re,
Ben, alors il suffit de faire
106485010510997108
Ben, alors il suffit de faire
open F,"fichier.txt" or die "E/S : $!\n"; open( OFILE, ">", "output_file.txt" ); while(<F>){ print OFILE if /biippp/ .. eof(); }--
106485010510997108
Maillon
Messages postés
156
Date d'inscription
mardi 4 octobre 2005
Statut
Membre
Dernière intervention
15 avril 2011
5
9 févr. 2009 à 15:08
9 févr. 2009 à 15:08
Merci lami20j.
Par contre cette ligne là elle est pas complète si ?
while(<F>){
print OFILE if /biippp/ .. eof();
}
parce que if /biippp/ .. eof(); ça fait quoi ?
edit :
Et je viens de tester ce que tu as écrit en remplacant juste le nom de fichier et ça ne marche pas et biippp par le nom. Il ne me génére rien.
#!/usr/bin/perl -w
open F,"result.txt" or die "E/S : $!\n";
open( OFILE, ">", "output_file.txt" );
while(<F>){
print OFILE if /Space shortage :/ .. eof();
}
Par contre cette ligne là elle est pas complète si ?
while(<F>){
print OFILE if /biippp/ .. eof();
}
parce que if /biippp/ .. eof(); ça fait quoi ?
edit :
Et je viens de tester ce que tu as écrit en remplacant juste le nom de fichier et ça ne marche pas et biippp par le nom. Il ne me génére rien.
#!/usr/bin/perl -w
open F,"result.txt" or die "E/S : $!\n";
open( OFILE, ">", "output_file.txt" );
while(<F>){
print OFILE if /Space shortage :/ .. eof();
}
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
9 févr. 2009 à 15:34
9 févr. 2009 à 15:34
Re,
biippp par le nom.
Ben j'aimerais bien voir cette partie avec le nom que tu as dans le fichier
biippp
important important
important importantimportant
Donc j'ai besoin de savoir avec exactitude ce que biippp répresente ;-)
Je n'ai pas des moyens pour tester mais dans environ une heure je vais regarder à la maison
biippp par le nom.
Ben j'aimerais bien voir cette partie avec le nom que tu as dans le fichier
biippp
important important
important importantimportant
Donc j'ai besoin de savoir avec exactitude ce que biippp répresente ;-)
Je n'ai pas des moyens pour tester mais dans environ une heure je vais regarder à la maison
Maillon
Messages postés
156
Date d'inscription
mardi 4 octobre 2005
Statut
Membre
Dernière intervention
15 avril 2011
5
9 févr. 2009 à 15:46
9 févr. 2009 à 15:46
Oki désolé de ne pas avoir donner toutes les infos alors.
Je répète en mieux alors :)
j'ai un fichier result.txt qui contient :
##########
Subject: Space shortage on op99vas3.
From: admin@mondomaine.net
To:
Host : op99vas3.
By default send alarm if at least 90% is used on a partition
User defined value(s) :
Slice /data/flf/99Vapp/logs : 80%
Slice /exec/products/netbackup : 50%
Space shortage :
Slice /data/flf/99Vapp/logs Now 81% : 366041 KB available
Slice /exec Now 93% : 48774 KB available
You can customize values by editing the file : /users/pikeo/sox_pikeo/seuilfs.cf
Syntax filesystem:value
##########
Et j'aimerai extraire dans un fichier tout ce qui se trouve après "Space shortage :" donc ça :
Slice /data/flf/99Vapp/logs Now 81% : 366041 KB available
Slice /exec Now 93% : 48774 KB available
You can customize values by editing the file : /users/pikeo/sox_pikeo/seuilfs.cf
Syntax filesystem:value
Sachant que le nombre de lignes à extraire est variable (c'est pas forcément les 5 dernières par exemple ça peut etre les 10 dernières).
Je pensais que ça suffisait comme info ce que j'avais donné pour faire le script mais apparement non :) désolé
J'espère avoir été assez clair :)
Merci encore.
Cordialement,
Je répète en mieux alors :)
j'ai un fichier result.txt qui contient :
##########
Subject: Space shortage on op99vas3.
From: admin@mondomaine.net
To:
Host : op99vas3.
By default send alarm if at least 90% is used on a partition
User defined value(s) :
Slice /data/flf/99Vapp/logs : 80%
Slice /exec/products/netbackup : 50%
Space shortage :
Slice /data/flf/99Vapp/logs Now 81% : 366041 KB available
Slice /exec Now 93% : 48774 KB available
You can customize values by editing the file : /users/pikeo/sox_pikeo/seuilfs.cf
Syntax filesystem:value
##########
Et j'aimerai extraire dans un fichier tout ce qui se trouve après "Space shortage :" donc ça :
Slice /data/flf/99Vapp/logs Now 81% : 366041 KB available
Slice /exec Now 93% : 48774 KB available
You can customize values by editing the file : /users/pikeo/sox_pikeo/seuilfs.cf
Syntax filesystem:value
Sachant que le nombre de lignes à extraire est variable (c'est pas forcément les 5 dernières par exemple ça peut etre les 10 dernières).
Je pensais que ça suffisait comme info ce que j'avais donné pour faire le script mais apparement non :) désolé
J'espère avoir été assez clair :)
Merci encore.
Cordialement,
nab
>
Maillon
Messages postés
156
Date d'inscription
mardi 4 octobre 2005
Statut
Membre
Dernière intervention
15 avril 2011
9 févr. 2009 à 17:01
9 févr. 2009 à 17:01
Concernant le code que je t'ai mis, le principe est simple, tu cherches ta chaine,
tant que tu ne la trouves pas :
1- tu continues à la chercher
2- tu laisses tomber la ligne courant, c'est à dire, tu ne l'écris pas dans ton fichier résultat.
dès que tu la trouve :
1- tu ne chercheras plus
2- tu écriras toutes les lignes suivantes dans ton fichier résultat.
Reste à savoir si, quand tu la trouves sur une ligne, tu laisses tomber toute la ligne, ou tu garderas le reste de la ligne, à toi de voir.
Quelques explications sur le code :
la variable $to_print, sert à savoir si on a trouvé la chaine recherchée ou pas.
while( $line = <IFILE> ) ==> boucle pour lire toutes les lignes du fichier qui contient ton texte.
if ($line=~/biippp/) ==> on cherche la chaine 'biippp' dans la chaine $ligne, si elle est trouvée, à l'intérieur des parenthèses on aura 1 (sinon 0)
print OFILE substr($line, index($line, 'biippp')+length('biippp'), length($line)); ==> à ce niveau, on a trouvé la chaine,
et dans ce cas, on écrit le reste de la ligne dans le fichier résultat.
Tu peux ne rien faire ici, si tu veux laisser tomber toute la ligne en question.
Une fois, la chaine 'biippp' trouvée, on passera toujours dans le "else", pour écrire toutes les lignes suivantes, sans aucune condition.
Cdt.
tant que tu ne la trouves pas :
1- tu continues à la chercher
2- tu laisses tomber la ligne courant, c'est à dire, tu ne l'écris pas dans ton fichier résultat.
dès que tu la trouve :
1- tu ne chercheras plus
2- tu écriras toutes les lignes suivantes dans ton fichier résultat.
Reste à savoir si, quand tu la trouves sur une ligne, tu laisses tomber toute la ligne, ou tu garderas le reste de la ligne, à toi de voir.
Quelques explications sur le code :
la variable $to_print, sert à savoir si on a trouvé la chaine recherchée ou pas.
while( $line = <IFILE> ) ==> boucle pour lire toutes les lignes du fichier qui contient ton texte.
if ($line=~/biippp/) ==> on cherche la chaine 'biippp' dans la chaine $ligne, si elle est trouvée, à l'intérieur des parenthèses on aura 1 (sinon 0)
print OFILE substr($line, index($line, 'biippp')+length('biippp'), length($line)); ==> à ce niveau, on a trouvé la chaine,
et dans ce cas, on écrit le reste de la ligne dans le fichier résultat.
Tu peux ne rien faire ici, si tu veux laisser tomber toute la ligne en question.
Une fois, la chaine 'biippp' trouvée, on passera toujours dans le "else", pour écrire toutes les lignes suivantes, sans aucune condition.
Cdt.
lami20j
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 569
9 févr. 2009 à 16:50
9 févr. 2009 à 16:50
Salut,
(c'est pas forcément les 5 dernières par exemple ça peut etre les 10 dernières).
En réalité le nombre de lignes peu importe.
L'extraction se fait par bloc donc quelque soit le nombre de lignes la seule partie qui sera récupérer c'est après Space shortage :
Le fichier
(c'est pas forcément les 5 dernières par exemple ça peut etre les 10 dernières).
En réalité le nombre de lignes peu importe.
L'extraction se fait par bloc donc quelque soit le nombre de lignes la seule partie qui sera récupérer c'est après Space shortage :
Le fichier
lami20j@debian:~/trash/ccm_perl$ cat fichier.txt Subject: Space shortage on op99vas3. From: admin@mondomaine.net To: Host : op99vas3. By default send alarm if at least 90% is used on a partition User defined value(s) : Slice /data/flf/99Vapp/logs : 80% Slice /exec/products/netbackup : 50% Space shortage : Slice /data/flf/99Vapp/logs Now 81% : 366041 KB available Slice /exec Now 93% : 48774 KB available You can customize values by editing the file : /users/pikeo/sox_pikeo/seuilfs.cf Syntax filesystem:value lami20j@debian:~/trash/ccm_perl$Le script
lami20j@debian:~/trash/ccm_perl$ cat ccm11_extraire_bloc.pl #!/usr/bin/perl use strict;use warnings; open F,"fichier.txt" or die "E/S : $!\n"; open RESULTAT, ">resultat.txt" or die "e/s : $!\n"; while(<F>){ next if 1 .. /Space shortage :/;# saute entre la 1ère ligne et Space shortage : print RESULTAT; # écrit ce qui reste dans le fichier } __END__ lami20j@debian:~/trash/ccm_perl$L'exécution et le resultat
lami20j@debian:~/trash/ccm_perl$ perl ccm11_extraire_bloc.pl lami20j@debian:~/trash/ccm_perl$ cat resultat.txt Slice /data/flf/99Vapp/logs Now 81% : 366041 KB available Slice /exec Now 93% : 48774 KB available You can customize values by editing the file : /users/pikeo/sox_pikeo/seuilfs.cf Syntax filesystem:value lami20j@debian:~/trash/ccm_perl$
Maillon
Messages postés
156
Date d'inscription
mardi 4 octobre 2005
Statut
Membre
Dernière intervention
15 avril 2011
5
10 févr. 2009 à 10:15
10 févr. 2009 à 10:15
Alors je viens d'essayer ce que tu as écris lami20j et ça marche nikel en plus j'ai pigé donc je suis content :) merci.
Et j'ai aussi essayer ce que tu as écrit nab et ça m'a pris plus de temps pour comprendre parce qu'il y a plus de mot "clé" et j'ai pas encore toute la logique pour comprendre tout ça du premier coup d'oeil. En tout cas c'est deux façon de faire qui sont complètement différente.
Merci à vous deux de m'avoir aider pour ce problème.
Cordialement,
Et j'ai aussi essayer ce que tu as écrit nab et ça m'a pris plus de temps pour comprendre parce qu'il y a plus de mot "clé" et j'ai pas encore toute la logique pour comprendre tout ça du premier coup d'oeil. En tout cas c'est deux façon de faire qui sont complètement différente.
Merci à vous deux de m'avoir aider pour ce problème.
Cordialement,