IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

perl analyse de fichier


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 7
    Par défaut perl analyse de fichier
    Bonjour je veux faire une analyse de mon fichier du nom de test.log qui contien les lignes suivantes:

    Jan-13 04:12:41 server.alpha.allo.com. ipop3d[26735]: pop3 service init from 132.204.24.100
    Jan-13 04:12:42 server.alpha.allo.com. imapd[26748]: imap service init from 132.204.24.100
    Jan-13 04:05:44 client.alpha.allo.com sendmail[22674]: i0D95hr8022674: to=root, ctladdr=root (0/1), delay=00:00:01,
    mailer=relay, pri=30271, relay=[127.0.0.1], dsn=2.0.0, stat=Sent (i0D95hEt022675 Message accepted for delivery)
    Jan-13 04:15:27 Andre.alpha.allo.com sshd2[412]: connection from "132.204.24.100"

    Je veux que mon script perl fasse l’analyse du fichier en question pour envoyer le resultat dans un fichier nommé « resultat.txt » que j’envoie directement avec sendmail a l’adresse courielle contenue dans la variable d’enironnement SYSADMIN.

    Le script doit :

    Trouver :
    -la période couverte du log (début-fin) avec dates et heures
    -le nombre total de traces (lignes) pour chaque machine (adresse-visée)
    -le nombre total de traces pour chaque service
    -le nombre de connexions pop, ssh et imap
    -la liste des adresses qui ont fait une connexion ssh et le nombre de fois chaque
    -la liste des adresses qui ont envoyé du courriel par sendmail et le nombre de fois chaque.

    J'avoue que certains vont dire que je suis nullllllllll, je le suis effectivement, j'aime perl mais comme debutant je le trouve difficile, ou peut etre suis juste nulllllll, de l'aide s'il vous des indices, suggestions, tuto etc...

    merci d'avance

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    #!/usr/bin/perl -w
    $StartTime = localtime;
    $DayCounter=0;
    $HitCounter=0;
    $nbSsh=0;
    $nbPop3=0;
    $nbImap=0;
     open (LOGFILE, "test.log") || die "can't open file";
     
      {
        $line = <LOG>;
        while ($line)
        {
     
          if ($line =~ m/^....-..-.. ..:..:../)
          {
     
            $HitCounter++;
            @e = split (/ /, $line);
            print ("$e[0], $e[1]\n");
            print $line; 
     
     
             #@Date = split (/-/, $e[0]);
             @Time = split (/:/, $e[1]);
           }
     
             if ($e[3] == "pop3")
             {
                $nbPop3++;
    	 }
    	if ($e[3] == "imap")
             {
                $nbImap++;
    	 }
    	if ($e[3] == "ssh")
             {
                $nbSsh++;
    	 }
    	if ($e[2] == "sendmail")
             {
    	    @e = split (/ /, $e[2])
                $nbPop3++;
    	 }
     
        }
     
     
    $EndTime = localtime;
    print "\n  Complete Report\n";
    print "  ===============\n";
    print "  Report started   : $StartTime\n";
    print "  Report ended     : $EndTime\n";
    printf ("  Hits                     : %12d\n", $HitCounter);
    printf ("  Hits (POP3)        : %12d\n", $nbPop3);
    printf ("  Hits (IMAP)        : %12d\n", $nbImap);
    printf ("  Hits (SSH)        : %12d\n", $nbSsh);
     
    |sort -k 2nr >Analyselog.txt
     
    }

  2. #2
    Membre chevronné Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Par défaut
    Des conseils en vrac :
    1. mets des balises code, tes posts seront plus lisibles
    2. utilise le pragma strict, cela t'évitera bien des soucis
    3. stock les informations que tu extrais dans des hash (en particulier pour le décompte)
    Voilà à titre d'exemple comment compter les "machines" (juste pour l'idée)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/usr/bin/perl
    use strict; use warnings;
     
    my %hostcount;
     
    while (<>) {
        my $host = (split /\s+/)[2];
        $hostcount{$host} += 1;
    }
     
    print map { "$_ $hostcount{$_}\n" } sort keys %hostcount;
    Oups, je vois que tu as un problème avec la lecture séquentielle de fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    open my $inputfh, '<', $inputfilename
        or die "$!\n"; 
    while ( my $line = <$inputfh>) {
        # ...
    }

  3. #3
    Membre chevronné Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Par défaut
    Un petit commentaire n'est peut être pas de trop.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    00    open my $inputfh, '<', $inputfilename
            or die "$!\n";
     
    01    my %hostcount;
     
    02    while (my $line = <$inputfh>) {
    03        my @data = split /\s+/, $line;
    04        my $host = $data[2];
    05        $hostcount{$host} += 1;
    06    }
     
    07    print map { "$_ $hostcount{$_}\n" } sort keys %hostcount;
    02 boucle de lecture du fichier, à chaque passage $line est initialisé avec une nouvelle ligne

    03 split sur les espaces, retourne une liste de valeur

    04 récupère le troisième élément

    05 incrémente la valeur dans le hash $hostcount pour la clé $host

    07 keys %hostcount renvoie la liste des clés du hash et les passe à map ; pour chaque clé map renvoie une chaîne composée de la clé et de la valeur suivi d'un "\n" ; la liste de chaînes construite par map est passée à print.

Discussions similaires

  1. Perl analyse de fichiers-logs
    Par finelady dans le forum Langage
    Réponses: 4
    Dernier message: 18/03/2008, 17h31
  2. [PERL] transformation de fichier
    Par bob20000 dans le forum Langage
    Réponses: 6
    Dernier message: 27/07/2006, 11h13
  3. Commande pour analyser un fichier avec lex et yacc
    Par gRaNdLeMuRieN dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 13/09/2005, 19h12
  4. Perl/Mason pb fichiers
    Par Katz dans le forum Modules
    Réponses: 5
    Dernier message: 08/08/2005, 11h54
  5. Programme qui analyse un fichier log
    Par abdou.sahraoui dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 20/08/2004, 14h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo