Re: Petit problème de programation

Top Page

Reply to this message
Author: jeanluc
Date:  
To: guilde
Subject: Re: Petit problème de programation
Bonjour,

Je pense que c'est plus facile en perl.
Possible que c'est faisable en bash mais après, tu vas vouloir devenir plus exigeant
(rajouter ceci, rajouter cela) et puis au final, tu finiras en perl. C'est souvent ce qui
m'arrive.
Jette un coup d'oeil sur ce qui j'ai fait .... quasiment pendant les coupures du match
de l'Allemagne ... j'ai fini le match avec la radio ... comme ca, on peut bricoler un peu
sur l'ordi.
..... alors, je disais, jette un coup d'oeil et puis ca sera déjà une base de départ pur toi.

prompt> cat mesLogs.txt
Packet-Type = Access-Request
Thu Jun 24 23:58:07 2008
        User-Name = "jp1234@???"
        User-Password = "******"
        NAS-IP-Address = 192.168.20.1
        Framed-IP-Address = 192.168.30.2
        NAS-Identifier = "Virtual-NASMONITOR"
        Proxy-State = 0x3932
        Client-IP-Address = 199.33.33.199


Packet-Type = Access-Accept
Thu Jun 24 23:58:07 2008
        NAS-IP-Address = 192.168.20.1
        Client-IP-Address = 199.33.33.199
        Realm = "dummy.fr"


prompt>
prompt>
prompt> cat mesLogs.txt |grepOnBloc.pl Virtual
Packet-Type = Access-Request
Thu Jun 24 23:58:07 2008
        User-Name = "jp1234@???"
        User-Password = "******"
        NAS-IP-Address = 192.168.20.1
        Framed-IP-Address = 192.168.30.2
        NAS-Identifier = "Virtual-NASMONITOR"
        Proxy-State = 0x3932
        Client-IP-Address = 199.33.33.199
...... 1 ......
prompt> tail -f /var/log/mesLogs.log | grepOnBloc.pl Virtual
....
prompt>
prompt>
prompt> cat $HOME/bin/grepOnBloc.pl
#!/usr/bin/perl
my $line;
my $imprimeCeBloc=0;
my @mesLignes=();


my $keyword=shift;

while( <> ) {
    $line = $_;
    if( $line =~ m/^\s*$/       )
    {
        if( $imprimeCeBloc )
        {
            foreach $i (@mesLignes)
            {
                print $i;
            };
            print "\n.... $imprimeCeBloc ... \n";  # debug seulement ... à supprimer
        };
        @mesLignes=();
        $imprimeCeBloc = 0;
    } else {
        push @mesLignes , $line;
        if( $line =~ m/${keyword}/ )
        {
            $imprimeCeBloc++;
        };
    };
}




>
> Je souhaiterai écrire une petit programe probablement en bash, perl, awk ou
> autre peu importe, qui me permette d'afficher un fichier de log de facon
> selective.
>
> Il s'agit de logs radius qui se présentent par blocs, exemple :
>
> Packet-Type = Access-Request
> Thu Jun 24 23:58:07 2008
>         User-Name = "jp1234@???"
>         User-Password = "******"
>         NAS-IP-Address = 192.168.20.1
>         Framed-IP-Address = 192.168.30.2
>         NAS-Identifier = "Virtual-NASMONITOR"
>         Proxy-State = 0x3932
>         Client-IP-Address = 199.33.33.199

>
> Packet-Type = Access-Accept
> Thu Jun 24 23:58:07 2008
>         NAS-IP-Address = 192.168.20.1
>         Client-IP-Address = 199.33.33.199
>         Realm = "dummy.fr"

>
> Je voudrais afficher en temps réel dans un terminal (l'equivalent d'un "tail
> -f "), ou stocker dans un fichier tous les blocs qui contiennent un pattern
> particulier, par exemple une adresse ip précise.
>
> Mon probleme c'est d'afficher le bloc complet, les blocs étant séparé par
> une ligne vide et la valeur recherhé pouvant se situer a n'importe quel
> endroit du bloc, qui n'a de plus pas une longueur fixe.
>
> Ce qui me manque principalement c'est une programme qui soit en écoute à la
> fin du fichier de log, qui stocke ce qu'il recoit jusqu'a recevoir une
> marque de fin de bloc, puis envoie ce bloc complet en traitement à un autre
> programme par exemple.
>
> Une idée?
> Merci,
>
> Jean-Michel.
>