script perl pour topten sur cache - Perl - Programmation
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 ?
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 ...
Marsh Posté le 08-12-2003 à 01:12:24
Code :
|
spa bon un truc simple comme ça ?
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 ...
Marsh Posté le 08-12-2003 à 01:22:27
Taz a écrit :
spa bon un truc simple comme ça ? |
Ai teste ..ca se rapproche de ce que je veux ... fais l'exploiter ... merci de ton aides .
Marsh Posté le 08-12-2003 à 02:52:53
Taz a écrit :
spa bon un truc simple comme ça ? |
ca semble excellent même
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 ';', $_ ;
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) ) |
Marsh Posté le 08-12-2003 à 08:24:16
Taz a écrit : tout en un je sais pas
|
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
Marsh Posté le 08-12-2003 à 21:57:19
yannvi a écrit : |
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
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}
Marsh Posté le 08-12-2003 à 22:05:03
Taz a écrit : mouef, il vaut peut $etre mieux |
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 ?
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 !
Marsh Posté le 08-12-2003 à 22:37:09
foreach my $url (keys %bytes_freq) |
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
Marsh Posté le 08-12-2003 à 22:42:53
Taz a écrit :
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
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