• STATISTIQUES
  • Il y a eu un total de 2 membres et 12986 visiteurs sur le site dans les dernières 24h pour un total de 12 988 personnes!


    Membres: 2 433
    Discussions: 3 585
    Messages: 32 832
    Tutoriels: 78
    Téléchargements: 38
    Sites dans l'annuaire: 58


  • ANNUAIRE
  • [FR] Developpez.net
    Un forum communautaire qui se veut pour les développeurs en générale. Avec presque 500 000 membr...
    Programmation
    [FR] Le site du zero
    Découvrez gratuitement la programmation (C, C++, PHP, MySQL, XHTML, CSS...), Linux, le Mapping, la modé...
    Programmation
    [FR] InfoMirmo
    Apprentissage de l'informatique par l'intermédiaire de challenges de sécurité. Venez app...
    Hacking
    [FR] WeChall
    Audio: 3, Coding: 11, Cracking: 9, Crypto: 18, Encoding: 11, Exploit: 44, Forensics: 1, Fun: 6, HTTP: 6, Image: 8, Java:...
    Challenges
    [FR] Forum-Webmaster
    Une communauté webmaster pour apporter / recevoir de l'aide en création de site internet. Webmaster...
    Webmaster
    [EN] Packet Storm
    Packet Storm est un site qui combine nouvelles de la sécurité informatique, téléchargemen...
    Vulnérabilités
    [EN] Rankk
    Site de challenge construit sur le principe d'une pyramide à 9 level. Level 1: 60,Level 2: 72,Level 3: 68,Lev...
    Challenges

  • DONATION
  • Si vous avez trouvé ce site internet utile, nous vous invitons à nous faire un don du montant de votre choix via Paypal. Ce don servira à financer notre hébergement.

    MERCI!




Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
question du jour
12-11-2013, 10h26
Message : #1
gruik Hors ligne
gouteur de savon
*



Messages : 757
Sujets : 44
Points: 482
Inscription : Oct 2012
question du jour
on part d'un fichier de logs apache classique, chaque ligne a un format du genre :
Code :
1.2.3.4 - - [12/Nov/2013:09:19:43 +0100] "GET / HTTP/1.1" 200 101 "referer" "user-agent"

je souhaite en parsant le fichier etablir le total du nombre de hits (== de lignes) par semaine, comment faire ?
Avant donc que d'écrire, apprenez à penser.
Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure.
Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément.
(Nicolas Boileau, L'Art poétique)
+1 (1) -1 (1) Répondre
12-11-2013, 10h51
Message : #2
notfound Hors ligne
#!/usr/bin/env bash
*



Messages : 687
Sujets : 47
Points: 272
Inscription : Sep 2012
RE: question du jour
Salut gruik,

Bon j'ai pas trop le temps (cours oblige) mais un truc du genre devrait t'aider :

Je pars de la date d'aujourd'hui (12) à laquelle j'ajoute +7 jours (une semaine) pour avoir des dates du 12 au 19.

Code BASH :

for (( i=0 ; i<=7 ; i++)); do date -d "$i day" +%d/%b/%Y ; done
12/nov./2013
13/nov./2013
14/nov./2013
15/nov./2013
16/nov./2013
17/nov./2013
18/nov./2013
19/nov./2013
 


Ensuite, une boucle et un grep, et ça semble pas trop mal.

Code BASH :

for (( i=0 ; i<=7 ; i++)); do for DATE in $(date -d "$i day" +%d/%b/%Y |sed 's/\.//'); do egrep -i "$DATE" log | wc -l ; done ; done
 
+1 (0) -1 (0) Répondre
12-11-2013, 11h03
Message : #3
gruik Hors ligne
gouteur de savon
*



Messages : 757
Sujets : 44
Points: 482
Inscription : Oct 2012
RE: question du jour
ok effectivement y'a de l'idée, au moment où j'ai écrit le post j'avais pas essayé du tout mais je savais que c'était pas hors de portée disons, j'aurais peut-être du poster dans la section défis Wink
là j'ai quelque chose de fonctionnel (et assez lent), go sur les solutions, je posterais la mienne d'ici ce midi
Avant donc que d'écrire, apprenez à penser.
Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure.
Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément.
(Nicolas Boileau, L'Art poétique)
+1 (0) -1 (1) Répondre
12-11-2013, 11h21
Message : #4
Junky Hors ligne
Snorky Master
*



Messages : 228
Sujets : 35
Points: 204
Inscription : Mar 2013
RE: question du jour
Bonjour.
Moi je suis partie la dessus:

Code :
for i in $(seq 1 31); do echo "jour $i"; awk '/'$i'\/Nov\/2013/ {gruik[$1]++} END {for (i in gruik){print gruik[i] " : " i}}' /var/log/apache2/access.log | sort -rnk1; done

J'ai tronqué le résultat pour as avoir un plein plage d'ip.. Smile

Code :
jour 1
34 : 195.132.139.189
13 : 90.10.217.13
12 : 74.219.163.186
6 : 91.121.162.189
6 : 109.228.20.156
4 : 88.186.255.121
4 : 86.205.206.77
4 : 78.237.200.16
2 : 89.46.161.210
2 : 46.228.199.181
2 : 173.193.38.234
2 : 132.248.130.105
1 : 92.240.68.152
1 : 92.240.236.161
1 : 87.106.227.246
1 : 66.197.231.130
1 : 50.56.224.198
1 : 221.132.35.243
1 : 211.137.235.145
1 : 184.106.204.19
1 : 168.62.176.74
1 : 113.108.150.211
jour 2
31 : 90.10.217.13
1 : 89.46.161.210
1 : 54.221.209.138
1 : 46.36.35.233
1 : 218.56.108.219
1 : 118.192.131.153
jour 3
jour 4
jour 5
jour 6
jour 7

Junky
Pour la sécurité, sous linux, le principal soucis est l'interface chaise/clavier

+1 (1) -1 (0) Répondre
12-11-2013, 11h25 (Modification du message : 12-11-2013, 11h29 par notfound.)
Message : #5
notfound Hors ligne
#!/usr/bin/env bash
*



Messages : 687
Sujets : 47
Points: 272
Inscription : Sep 2012
RE: question du jour
Du coup j'ai fait ça :

Code BASH :

#!/bin/bash
CPT=0 ; RES=0
for (( i=0 ; i<=7 ; i++)); do
        for DATE in $(date -d "$i day" +%d/%b/%Y |sed 's/\.//'); do
                CPT=$(egrep -i "$DATE" log|wc -l)
                RES=$((CPT+RES))
        done
done
echo "$RES"
 


J'ai simulé un fichier de log :
Code BASH :

 cat log
1.2.3.4 - - [11/Nov/2013:09:19:43 +0100] "GET / HTTP/1.1" 200 101 "referer" "user-agent"
1.2.3.4 - - [12/Nov/2013:09:19:43 +0100] "GET / HTTP/1.1" 200 101 "referer" "user-agent"
1.2.3.4 - - [13/Nov/2013:09:19:43 +0100] "GET / HTTP/1.1" 200 101 "referer" "user-agent"
1.2.3.4 - - [13/Nov/2013:09:19:43 +0100] "GET / HTTP/1.1" 200 101 "referer" "user-agent"
1.2.3.4 - - [14/Nov/2013:09:19:43 +0100] "GET / HTTP/1.1" 200 101 "referer" "user-agent"
1.2.3.4 - - [16/Nov/2013:09:19:43 +0100] "GET / HTTP/1.1" 200 101 "referer" "user-agent"
1.2.3.4 - - [16/Nov/2013:09:19:43 +0100] "GET / HTTP/1.1" 200 101 "referer" "user-agent"
1.2.3.4 - - [19/Nov/2013:09:19:43 +0100] "GET / HTTP/1.1" 200 101 "referer" "user-agent"
1.2.3.4 - - [20/Nov/2013:09:19:43 +0100] "GET / HTTP/1.1" 200 101 "referer" "user-agent"
1.2.3.4 - - [21/Nov/2013:09:19:43 +0100] "GET / HTTP/1.1" 200 101 "referer" "user-agent"
1.2.3.4 - - [22/Nov/2013:09:19:43 +0100] "GET / HTTP/1.1" 200 101 "referer" "user-agent"
 


J'obtiens :

Code BASH :

./gruik
7
 


Voilou.
+1 (1) -1 (0) Répondre
12-11-2013, 11h41
Message : #6
gruik Hors ligne
gouteur de savon
*



Messages : 757
Sujets : 44
Points: 482
Inscription : Oct 2012
RE: question du jour
@junky: tu comptabilises le nombre d'adresses IP différentes pour chaque jour du mois
@NotFound: tu comptabilises le nombre de hits sur les 7 derniers jours uniquement

ce que je veux c'est comptabiliser le nombre de hits par semaine dans la totalité du fichier, sur le calendrier "classique" càd que le premier lundi de l'année ben on est dans la semaine 1
Avant donc que d'écrire, apprenez à penser.
Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure.
Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément.
(Nicolas Boileau, L'Art poétique)
+1 (0) -1 (1) Répondre
12-11-2013, 11h45
Message : #7
Junky Hors ligne
Snorky Master
*



Messages : 228
Sujets : 35
Points: 204
Inscription : Mar 2013
RE: question du jour
Bah fais un mix des 2... Big Grin

Je regarderai un peu plus tard... Taf oblige.. :/
Pour la sécurité, sous linux, le principal soucis est l'interface chaise/clavier

+1 (0) -1 (0) Répondre
12-11-2013, 13h03
Message : #8
gruik Hors ligne
gouteur de savon
*



Messages : 757
Sujets : 44
Points: 482
Inscription : Oct 2012
RE: question du jour
ok donc une solution possible c'est un truc comme ça (oneliner, je le déroule pour la lisibilité) :
Code BASH :
cat access.log |
grep -Po "\[.+\]" |
awk -F'[ /\t:]+' '
BEGIN {
   split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec",month);
   for (i in month) {
      month_nums[month[i]]=i
   }
}
{
   $0=substr($0,2,26);
   printf ("%s/%s/%s %s:%s:%s %s\n", month_nums[$2], substr($1,2,2), $3, $4, $5, $6, $7)
}'
|
xargs -ITOTO date -d"TOTO" +%U | awk '
{
   tab[$0]++
}
END {
   for (i in tab) {
      print "semaine " i " : " tab[i] | "sort -nk2"
   }
}'


c'est TRES lent et assez moche en plus de pas être rapide à pondre et pas intuitif non plus
concrètement on commence par isoler avec grep la date comprise entre corchets "[42/Gam/1337:98:76:54 +0666]"
le awk qui suit fait l'essentiel du boulot, il sépare la chaine, prend le 2e champ et le remplace à chaque fois par le numéro du mois qui correspond, à la fin on affiche tout sous une forme adéquate (à l'anglaise) pour que ça plaise à date
ensuite on récupère donc le merdier avec xargs et on le file à date, on ressort avec le format %U qui nous donne le numéro de la semaine
enfin avec le dernier awk reste a comptabiliser le nombre de lignes qui ont le même numéro, trier le tout et afficher propre

si quelqu'un a plus court et/ou plus rapide je suis tout à fait preneur, sinon vous privez pas pour poser vos solution malgré tout Wink
Avant donc que d'écrire, apprenez à penser.
Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure.
Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément.
(Nicolas Boileau, L'Art poétique)
+1 (3) -1 (1) Répondre
12-11-2013, 13h05
Message : #9
Junky Hors ligne
Snorky Master
*



Messages : 228
Sujets : 35
Points: 204
Inscription : Mar 2013
RE: question du jour
Ouep en effet ca a l'air assez lourd comme process...

Je regarderai ce soir pour ma part... Smile
Pour la sécurité, sous linux, le principal soucis est l'interface chaise/clavier

+1 (0) -1 (0) Répondre
12-11-2013, 15h48 (Modification du message : 12-11-2013, 16h10 par gruik.)
Message : #10
gruik Hors ligne
gouteur de savon
*



Messages : 757
Sujets : 44
Points: 482
Inscription : Oct 2012
RE: question du jour
plus court et plus rapide, toujours en une seule ligne :
Code :
cat access.log | perl -MPOSIX -lne '
%m = ("Jan","01","Feb","02","Mar","03","Apr","04","May","05","Jun","06",
      "Jul","07","Aug","08","Sep","09","Oct","10","Nov","11","Dec","12");
$t{
   POSIX::strftime("%V", $6,$5,$4,$1,$m{$2}-1,$3-1900)
}++ if /\[(..)\/(...)\/(....):(..):(..):(..).+\]/;
END {
   foreach $s (sort keys %t) {
      print "semaine ".$s." : ".$t{$s}
   }
}'
toujours aussi degueu en revanche mais ça je crois pas qu'on puisse y échapper Big Grin

et ça donne ça :
Code :
# wc -l < access.log
384059
# time (...)
semaine 44 : 102965
semaine 45 : 234023
semaine 46 : 47071

real    0m5.463s
user    0m4.820s
sys     0m0.700s
Avant donc que d'écrire, apprenez à penser.
Selon que notre idée est plus ou moins obscure, l'expression la suit, ou moins nette, ou plus pure.
Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément.
(Nicolas Boileau, L'Art poétique)
+1 (3) -1 (1) Répondre


Sujets apparemment similaires…
Sujet Auteur Réponses Affichages Dernier message
  question du jour 2 - le retour gruik 20 5,373 04-06-2014, 19h08
Dernier message: wapiflapi
  Question pour la création de mon site... Wabouz 10 2,445 05-03-2013, 21h14
Dernier message: Wabouz

Atteindre :


Utilisateur(s) parcourant ce sujet : 3 visiteur(s)
N-PN
Accueil | Challenges | Tutoriels | Téléchargements | Forum | Retourner en haut