script perl pour topten sur cache

script perl pour topten sur cache - Perl - Programmation

Marsh Posté le 08-12-2003 à 00:29:37    

bonjour ,  
 
je veux sortir un top ten des site visite par le membre d un reseau authentifier sur mon cache proxy ... la structure du ficier que je recupere est la suivante  
 
-; url;octet;hit
srvname;h18000.www1.hp.com;396;382
srvname;welcome.hp-ww.com;394;387
srvname;hphqglobal.112.2o7.net;1336;1005
srvname;hphqglobal.112.2o7.net;1429;881
srvname;www.lesjeudis.com;506;382
srvname;hphqglobal.112.2o7.net;1429;881
srvname;www.lesjeudis.com;506;382
 
 
je veut donc pour chaque url faire le total des hit et des octet transmis ...  
 
je le suis fais un script du genre ...
 
 
#!/usr/bin/perl
# Affiche les mots répétés dans un texte
 
open(F1,"/root/tmp/script/tmp_log" );
while(<F1> ) {  
    @tab_ligne = (split(/;/,$_))[1];
    @tab_hit = (split(/;/,$_))[2];
    @tab_oct = (split(/;/,$_))[3];
    foreach $mot (@tab_ligne){
        $tab_freq{$mot}++;
    }
    foreach $hit (@tab_hit){
        $tab_fhit{$hit}++;
    }
 foreach $oct (@tab_oct){
        $tab_foct{$oct}++;
    }
 
}
 
open (FHO, '| sort +1 -nr');
foreach $mot (keys(%tab_freq)){
    if ($tab_freq{$mot} > 1){
        $hit += $tab_fhit{$hit};
#        $tab_foct{$oct}++;
#        printf FHO "%s\t%d\n", $mot, $tab_freq{$mot};
        printf FHO "$mot".";"."$hit\n";
    }
}
close FHO
 
 
mais ca ne marche pas ...  
Qu un pourrait me dire ou ca merde  
 
j en ai fait un autre genre ...  
 
 
 
#!/usr/bin/perl -w
 
open(F1,"/root/tmp/script/http_0312_log" );
  open(F2,">>/root/tmp/script/tmp_log" );
while(<F1> ) {
  $ip=(split(/ /,$_))[0];
  $url0=(split(/ /,$_))[6];
  $url=(split(/\//,$url0))[2];
  $hit=(split(/ /,$_))[14];
  $octet=(split(/ /,$_))[15];
 
# stockage ds un fichier temporaire  
     print F2 "$ip".";"."$url".";"."$hit".";"."$octet\n";
  }
  close(F2);
 close(F1);
 
#je recupere le nombre de ligne de monfichier_tmp
  open(F2,"/root/tmp/script/tmp_log" );
   $nbligne +=tr/\n/\n/ while sysread(F2,$_,2**16);
  close(F2);
 
# monfichier_tmp a une structure genre
#ip;domaine;hit;octet
 
#ip;www.foo.com;200;200
#ip;www.cuisine.org;200
#ip;www.foo.com;200;200
#ip;www.cuisine.org;200;200
#
# j ai besoin sur le top ten des site visite de faire le total des hits et des octets transferer
#
#mon code  
#creation de tableau temporaire via une subroutine
 
sub tableau {  
 
  @tab_domaine=();
  @tab_hit=();
  @tab_octet=();
 
 open(F2,"</root/tmp/script/tmp_log" );
 while(<F2> ) {
      push(@tab_domaine,(split(/;/,$_))[1]);
      push(@tab_hit,(split(/;/,$_))[2]);
      push(@tab_octet,(split(/;/,$_))[3]);
}
return(\@tab_domaine, \@tab_hit, \@tab_octet);
}
# Ainsi je recupere 3 tableau contenant nom de domain , hit et octet
#
#maintenant , pour chaque domaine faire la somme des hit et des octets , celui qui depasse les dix est  
#enregister ds un nouveau fichiers
#initialisation d un tableau pour enregister les top ten
 
 
#appel de tableau pour recupere les trois tableau ci-dessus
tableau();
 
for ($i=0; $i <= $nbligne; $i++)  {
    $ntop=1;
  for ($k=1; $k <= $nbligne; $k++)  {  
       if ( $tab_domaine[$i] eq $tab_domaine[$i+$k])
             {
               $tab_hit[$i] += $tab_hit[$i+$k];
               $tab_oct[$i] += $tab_oct[$i+$k];
               $ntop++;
              }
               $nbligne -= $k;
            if ($ntop gt 10)  
                  {
                    open(F3,">>/root/tmp/script/result_log" );
                     print F3 "servername".";"."$tab_domaine[$i]".";"."$tab_hit[$i]".";"."$tab_oct[$i]\n";
                    close(F3);
                }  
}
}
 
Idem rien ... please help

Reply

Marsh Posté le 08-12-2003 à 00:29:37   

Reply

Marsh Posté le 08-12-2003 à 00:43:32    

j'ai rien compris à ce que tu voulais faire. tu donnes les données, tu veux quoi en sortie ?

Reply

Marsh Posté le 08-12-2003 à 00:55:47    

Taz a écrit :

j'ai rien compris à ce que tu voulais faire. tu donnes les données, tu veux quoi en sortie ?


 
je veux sortir pour chaque url , le total d octets transferer ...

Reply

Marsh Posté le 08-12-2003 à 01:12:24    

Code :
  1. use warnings;
  2. use strict;
  3. my %bytes_freq = ();
  4. while(<> )
  5. {
  6.     chomp ;
  7.     my @fields = split ';', $_ ;
  8.     my ($url, $hits, $bytes) = ($fields[1], $fields[2], $fields[3]) ;
  9.     print "$url $hits $bytes\n" ;
  10.     $bytes_freq{$url} += $bytes ;
  11. }
  12. print "\n" ;
  13. foreach my $url (keys %bytes_freq)
  14. {
  15.     print "$url -> $bytes_freq{$url}\n" ;
  16. }

spa bon un truc simple comme ça ?

Reply

Marsh Posté le 08-12-2003 à 01:12:33    

Taz a écrit :

j'ai rien compris à ce que tu voulais faire. tu donnes les données, tu veux quoi en sortie ?


 
Vais essayer d'etre plus precis :  
quand un site apparait plusieur fois , par ex : www.lesjeudis.com ,  
je veux donc pour chaque ligne ou celui-ci figure , additionner les champs octet et hit ( 2eme et 3eme )(separateur ";" )  
 
srvname;h18000.www1.hp.com;396;382
srvname;welcome.hp-ww.com;394;387
srvname;hphqglobal.112.2o7.net;1336;1005
srvname;hphqglobal.112.2o7.net;1429;881
srvname;www.lesjeudis.com;506;382
srvname;hphqglobal.112.2o7.net;1429;881
srvname;www.lesjeudis.com;506;382
 
 
j 'espere que kk un vois ce que veux faire ...

Reply

Marsh Posté le 08-12-2003 à 01:22:27    

Taz a écrit :

Code :
  1. use warnings;
  2. use strict;
  3. my %bytes_freq = ();
  4. while(<> )
  5. {
  6.     chomp ;
  7.     my @fields = split ';', $_ ;
  8.     my ($url, $hits, $bytes) = ($fields[1], $fields[2], $fields[3]) ;
  9.     print "$url $hits $bytes\n" ;
  10.     $bytes_freq{$url} += $bytes ;
  11. }
  12. print "\n" ;
  13. foreach my $url (keys %bytes_freq)
  14. {
  15.     print "$url -> $bytes_freq{$url}\n" ;
  16. }

spa bon un truc simple comme ça ?


 
Ai teste ..ca se rapproche de ce que je veux ... fais l'exploiter ... merci de ton aides .

Reply

Marsh Posté le 08-12-2003 à 02:52:53    

Taz a écrit :

Code :
  1. use warnings;
  2. use strict;
  3. my %bytes_freq = ();
  4. while(<> )
  5. {
  6.     chomp ;
  7.     my @fields = split ';', $_ ;
  8.     my ($url, $hits, $bytes) = ($fields[1], $fields[2], $fields[3]) ;
  9.     print "$url $hits $bytes\n" ;
  10.     $bytes_freq{$url} += $bytes ;
  11. }
  12. print "\n" ;
  13. foreach my $url (keys %bytes_freq)
  14. {
  15.     print "$url -> $bytes_freq{$url}\n" ;
  16. }

spa bon un truc simple comme ça ?


 
ca semble excellent même :D
 
première fois que je vois un split écrit de la sorte par contre
 
et ya pas moyen de splitter directement dans $url, $hits, $bytes? du genre
 
my ($url, $hits, $bytes, $bidon) = split ';', $_ ;


---------------
http://www.boincstats.com/signature/user_664861.gif
Reply

Marsh Posté le 08-12-2003 à 03:12:18    

tout en un je sais pas
 

my ($url, $hits, $bytes) =  splice @fields, 1, 4;


fonctionne, mais j'arrive pas à combiner
 
splice split
 
c'est intégré, et là je bloque.
 
autre remarque pour le foreach, tu peux très bien écrire
 

while( my ($url, $bytes) = each(%bytes_freq) )
{
   print "$url => $bytes\n" ;
}

Reply

Marsh Posté le 08-12-2003 à 08:24:16    

Taz a écrit :

tout en un je sais pas
 

my ($url, $hits, $bytes) =  splice @fields, 1, 4;


fonctionne, mais j'arrive pas à combiner
 
splice split
 
c'est intégré, et là je bloque.
 
autre remarque pour le foreach, tu peux très bien écrire
 

while( my ($url, $bytes) = each(%bytes_freq) )
{
   print "$url => $bytes\n" ;
}




 
 
Oui ca marche mais que sur un champ ...j'ai essayer un combinaison pour sortir en meme temps le total de hit pour chaue url ... en gros ca revient a faire un hachage multidimensionel que je manipule assez mal

Reply

Marsh Posté le 08-12-2003 à 21:57:19    

yannvi a écrit :


 
 
Oui ca marche mais que sur un champ ...j'ai essayer un combinaison pour sortir en meme temps le total de hit pour chaue url ... en gros ca revient a faire un hachage multidimensionel que je manipule assez mal


 
OK merci de ton aide ... j ai fait un while combine genre  
while( ( my ($url, $bytes) = each(%bytes_freq) ) && ( my ($url, $hit) = each(%hit_freq) ) )
{
   print "$url".";"."$bytes".";"."$hit\n" ;
}
 
ca fonctionne

Reply

Marsh Posté le 08-12-2003 à 21:57:19   

Reply

Marsh Posté le 08-12-2003 à 22:00:54    

mouef, il vaut peut $etre mieux
 
faire un $url (keys %bf)
 
en ensuite  
 
%bf{$url} et $hf{$url}

Reply

Marsh Posté le 08-12-2003 à 22:05:03    

Taz a écrit :

mouef, il vaut peut $etre mieux
 
faire un $url (keys %bf)
 
en ensuite  
 
%bf{$url} et $hf{$url}


 
Vais voir car j ai un erreur dans le genre  
 
"my" variable $url masks earlier declaration in same statement at 7.pl line 19......  
 
Tu peux preciser ta pensee ?

Reply

Marsh Posté le 08-12-2003 à 22:08:08    

pas % mais $

Reply

Marsh Posté le 08-12-2003 à 22:33:54    

Taz a écrit :

pas % mais $


 
ben vois pas comment dois faire la modif ...  
suis un mauvais developpeur !

Reply

Marsh Posté le 08-12-2003 à 22:37:09    

foreach my $url (keys %bytes_freq)
{
    print "$url -> $bytes_freq{$url}\t$hits_freq{$url}" ;
}

t'es sur d'avoir déjà fait du perl ? moi je réponds à ton sujet, ça fait 2 ans que j'ai pas fait de Perl mine de rien

Reply

Marsh Posté le 08-12-2003 à 22:42:53    

Taz a écrit :

foreach my $url (keys %bytes_freq)
{
    print "$url -> $bytes_freq{$url}\t$hits_freq{$url}" ;
}

t'es sur d'avoir déjà fait du perl ? moi je réponds à ton sujet, ça fait 2 ans que j'ai pas fait de Perl mine de rien


 
Y a 5 ans ..a la fac .ca remonte et j etais pas un fana du hash...lol

Reply

Sujets relatifs:

Leave a Replay

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