2010-06-24 5 views
-1

Perl newbie ici. J'ai un fichier journal que j'ai besoin d'analyser "Sauvegarde réussie" et toutes les entrées "Erreur:". J'ai essayé d'analyser le fichier journal en utilisant unix cat et en le redirigeant vers grep. J'ai obtenu l'information que je veux, mais je voudrais essayer cela en perl et avoir aussi l'option de passer un paramètre de date et de me donner les lignes en fonction de la date dont j'ai besoin.perl aider à analyser le fichier journal en fonction de la saisie du temps

Exemple de sortie du fichier journal: (sauvegarde réussi)

Wed Jun 09 06:14:25 2010: db2.cal.mil.mad:backup:INFO: flush-logs-time=00:00:00 
Wed Jun 09 06:14:25 2010: db2.cal.mil.mad:backup:INFO: backup-time=06:14:23 
Wed Jun 09 06:14:25 2010: db2.cal.mil.mad:backup:INFO: backup-status=Backup succeeded 
Wed Jun 09 06:14:25 2010: db2.cal.mil.mad:backup:INFO: Backup succeeded 

Exemple de sortie du fichier journal: (erreur :)

Wed Jun 09 05:00:03 2010: rip1.mil.mad:backup:ERROR: mysql-zrm appears to be already running for this backupset 
Wed Jun 09 05:00:03 2010: rip1.mil.mad:backup:ERROR: If you are sure mysql-zrm is not running, please remove the file /etc/mysql-zrm/rip1.mail.mad/.mysql-zrm.pid and restart mysql-zrm 

** Je voudrais un texte et/ou par courriel avec cette information. Comme si, mais avec l'option de passer la date dont j'ai besoin.

Wed Jun 09 05:00:03 2010: rip1.mil.mad:backup:ERROR: mysql-zrm appears to be already running for this backupset 
Wed Jun 09 05:00:03 2010: rip1.mil.mad:backup:ERROR: If you are sure mysql-zrm is not running, please remove the file /etc/mysql-zrm/rip1.mail.mad/.mysql-zrm.pid and restart mysql-zrm 
Wed Jun 09 06:14:25 2010: db2.cal.mil.mad:backup:INFO: backup-status=Backup succeeded 

Si vous souhaitez me fournir un code perl et/ou des idées pour commencer. Je vous serais reconnaissant de l'aide. Je vous remercie.

Répondre

1
#!/usr/bin/perl 

# usage example: <this script> Jun 09 2010 <logfile> 

use strict; 
use warnings; 

my ($mon,$day,$year) = ($ARGV[0],$ARGV[1],$ARGV[2]); 

open(FH,"< $ARGV[3]") or die "can't open log file $ARGV[3]: $!\n"; 

while (my $line = <FH>) { 
    if ($line =~ /.* $mon $day \d{2}:\d{2}:\d{2} $year:.*(ERROR:|Backup succeeded)/) { 
    print $line; 
} 
} 
+0

Parfait! Cela fonctionne très bien. Exactement ce dont j'ai besoin. Merci de votre aide! – jdamae

1

Voici un script simple. Le nom du fichier à analyser et la date cible sont codés en dur. Les correspondances sont imprimées sur STDOUT.

BTW, ce code est totalement non testé. Je l'ai tapé dans la zone de texte de mon navigateur.

use strict; 
use warnings; 

my $logpath = './bar/log'; 
my $target = 'Jun 09 2010'; 

open my $fh, '<', $logpath or die "Error opening $logpath $!\n"; 

while (my $line = <$fh>) { 

    next unless date_match($target, $line); 

    next unless my $result = got_error($line) // got_backup($line);  

    print $result; 
} 

sub got_backup { 
    my $line = shift; 

    return unless $line =~ /backup-status=Backup succeeded/; 

    return $line; 
} 

sub got_error { 
    my $line = shift; 

    return unless $line =~ /:ERROR:/; 

    return $line; 
} 


# Take a line and a target date. Compare the date derived from the line to 
# the target, and returns true if they match. 
# Also always returns true if target is not defined 

sub date_match { 
    my $target = shift; 
    my $line = shift; 

    return 1 unless defined $target; # Always true if target is undefined. 

    # Where did that god-awful date format come from? Yech. 
    my $date = extract_date($line); 

    return $date eq $target; 
} 

# Simple extract of date using split and join with extra variables 
# to make it newbie friendly. 
# IMO, it would be a good idea to switch to using DateTime objects and 
# DateTime::Format::Strptime 

sub extract_date { 
    my $line = shift; 

    my @parts = split /:/, $line; 
    my $date = join ':' @parts[0..2]; 
    @parts = split /\s+/, $date; 

    $date = @parts[1,2,4]; 

    return $date;   
} 
  • Vous pouvez utiliser Getopt::Long pour obtenir un nom de fichier et la date cible.

  • Il serait judicieux d'utiliser un schéma d'analyse et de comparaison date/heure plus robuste. DateTime et les amis sont de très bons modules puissants pour la manipulation de la date. Vérifie-les.

  • Si vous traitez des tonnes de données et devez être plus efficace, vous pouvez éviter de copier $line partout de plusieurs façons.

  • Pour référence ultérieure, si vous postez un petit code, vous obtiendrez de meilleures réponses

Questions connexes