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
Bonjour,

Voilà j'ai un fichier et j'aimerai en récupérer que les dernières lignes (mais on ne peut pas savoir combien il y a de ligne à récupérer) en perl.

En fait je ce que j'aimerai c'est récupérer tout ce qui se trouve après une certaines chaînes.

Par exemple dans mon fichier j'ai :


bla bla
bla bla
bla bla
bla bla

biippp
important important
important importantimportant important
important important

Et bien j'aimerai récupérer tout ce qui se trouve après biippp (et c'est toujours après biippp que se trouve le texte que je dois récupérer).

Je sais pas trop comment m'y prendre, si je dois passer par un fichier temporaire ou pas. Je pense qu'en perl ça doit pas être très compliqué mais j'en ai aucune idée.

J'ai cherché sur le net mais je ne trouve pas ce que je veux. J'ai vu les commandes seek et tell mais je pense pas que ce soit ça qu'il faille utiliser.

Merci de votre aide.

Cordialement,

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 565
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.
open F,"fichier.txt" or die "E/S : $!\n";

while(<F>){
    print if /biippp/ .. eof();
}
--
106485010510997108
0
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.
0
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
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 :) )
0
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 565
9 févr. 2009 à 15:05
Re,

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
0
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
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();
}
0

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 565
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
0
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
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,
0
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
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.
0
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 565
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
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$
0
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
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,
0