[perl] lire un fichier à l'envers

lire un fichier à l'envers [perl] - Perl - Programmation

Marsh Posté le 04-07-2005 à 15:33:38    

Bonjour,
je dois récupérer des informations dans un fichier de log à l'aide d'un script perl. Hors un même log peut être présent plusieurs fois dans ce fichier et seul la dernière entrée m'interesse. C'est pourquoi plutot que de parcourir tout le fichier je voudrais savoir s'il serait possible de parcourir se fichier en partant de la fin.
Merci d'avance.


---------------
De Marx j'ai avant tout retenu la notion de capital
Reply

Marsh Posté le 04-07-2005 à 15:33:38   

Reply

Marsh Posté le 04-07-2005 à 15:36:05    

Reply

Marsh Posté le 04-07-2005 à 15:38:48    

thurfin a écrit :

Bonjour,
je dois récupérer des informations dans un fichier de log à l'aide d'un script perl. Hors un même log peut être présent plusieurs fois dans ce fichier et seul la dernière entrée m'interesse. C'est pourquoi plutot que de parcourir tout le fichier je voudrais savoir s'il serait possible de parcourir se fichier en partant de la fin.
Merci d'avance.


`tac ton_fichier`
mais tu ferais mieux d'utiliser tail ou une fonction équivalente en Perl

Reply

Marsh Posté le 04-07-2005 à 16:16:31    

je vais voir si je peut exploiter ce module (l'installer sur le serveur déjà).
Merci.


---------------
De Marx j'ai avant tout retenu la notion de capital
Reply

Marsh Posté le 05-07-2005 à 04:41:13    

open(FENT, '< tonfichier.txt');
foreach my $line (reverse(<FENT> )) {
  print $line;
}
close(FENT);


Message édité par burgergold le 05-07-2005 à 04:44:50
Reply

Marsh Posté le 05-07-2005 à 09:05:35    

ou mais la tu lis le fichier entirement en memoire.
dans ce ca autant tapper un bonne grosse regexp pour aller chercher la derniere occurence de ce que l'on cherche (si on ne cherche qu'une seule chose)


Message édité par pospos le 05-07-2005 à 09:07:00
Reply

Marsh Posté le 05-07-2005 à 09:32:03    

->Burgergold
ca m'a l'air pas mal. Merci


---------------
De Marx j'ai avant tout retenu la notion de capital
Reply

Marsh Posté le 06-07-2005 à 19:59:35    

bah tu met ton fichier dans un tableau

Code :
  1. fichier = <FILE>;


puis tu lis la derniere case du tableau
pas besoin de faire de boucle  :)

Reply

Marsh Posté le 07-07-2005 à 04:02:20    

bioinfo_djib a écrit :

bah tu met ton fichier dans un tableau

Code :
  1. fichier = <FILE>;


puis tu lis la derniere case du tableau
pas besoin de faire de boucle  :)


 
il veut pas simplement la dernière case, il veut parcourir à l'envers

Reply

Marsh Posté le 07-07-2005 à 14:54:39    

bah il peut parcourir le tableau de la derniere case à la premiere

Reply

Marsh Posté le 07-07-2005 à 14:54:39   

Reply

Marsh Posté le 07-07-2005 à 15:35:32    

mettre le fichier dans un tableau hum je sais pas trop


---------------
De Marx j'ai avant tout retenu la notion de capital
Reply

Marsh Posté le 07-07-2005 à 17:32:19    

le reverse a le meme effet, c'est dans un tableau temporaire en mémoire

Reply

Marsh Posté le 07-07-2005 à 17:34:22    

A mon avis, si le fichier est de taille conséquente (ce qui arrive souvent avec les logs), il serait plus judicieux d'utiliser le module que pospos a mis en lien.
 
Il est fait spécialement pour ça, inutile de bricoler.


Message édité par Elmoricq le 07-07-2005 à 17:34:44
Reply

Marsh Posté le 08-07-2005 à 02:31:18    

Elmoricq a écrit :

A mon avis, si le fichier est de taille conséquente (ce qui arrive souvent avec les logs), il serait plus judicieux d'utiliser le module que pospos a mis en lien.
 
Il est fait spécialement pour ça, inutile de bricoler.


 
ca dépend toujours de l'environnement
 
si on parle d'un environnement de plusieurs serveurs dont l'images doit rester la plus intact possible en cas de recouvrement, je recommanderais ma méthode en sachant que les logs ne doivent pas être gros car ca bouffe de l'espace disque pour rien, il faut archiver à intervalle régulier
 
moi je dis que si c'est moins de 20mo le log et que ca ne roule pas plusieurs fois par jours, pas la peine de se casser la tete

Reply

Marsh Posté le 08-07-2005 à 10:50:46    

les logs sont sous forme de journeaux quotidiens et ne font que quelques dizaines de ko pour les plus gros.
le reversesemble fonctionner et j'ai pas trop envie de me lancer sur le module (tout un bordel faut appeler un admin pour l'installer tout ca)
 
par contre j'ai un prb:
ma ligne dans le fich de log est formée de cette manière:
 
bla_bla_192.168.1.25:1 infossnmp;2 infos snmp2; etc
 
dans mon script je souhaite séparé l'en-tête dans un tableau(bla_bla_192.168.1.25) du reste.
Prb le séparateur ':' apparait dans certaine infos snmp (ex up time sous forme nb jour hh:mm:ss)
 
bref avec split c pas glop
j'ai fait ca :
 

Code :
  1. @ligne = split ':', $line;


 
si quequ'un pouvait m'éclairé sachant qu'il n'est pas possible de changer le séparateur, je suis obligé de garder ':'.
Merci.


---------------
De Marx j'ai avant tout retenu la notion de capital
Reply

Marsh Posté le 08-07-2005 à 14:36:39    

my ($header, @smtp_info) = split(':', $line);
my $smtp_info = join('', @smtp_info);

Reply

Marsh Posté le 08-07-2005 à 14:42:02    

bon j'y arrive j'ai fait ca à l'arrache (décolage et recolage après des éléments)


---------------
De Marx j'ai avant tout retenu la notion de capital
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed