[gull] Filtrage d'unicité avec comptage d'apparition

Félix Hauri felix at f-hauri.ch
Thu Mar 10 00:02:18 CET 2011


Bonjour,

On Wed, Mar 09, 2011 at 11:44:40AM +0100, Yves Martin wrote:
> ... traiter des logs ...
>      grep | cut | sort -u
> 
> Mais j'aimerai sortir un comptage d'apparition des adresses IP extraites.

Ce serait assez une question ``d'école'' façon ``épreuve'', mais
avec un ``petit piège'' et le premier gagnant est *magnus*!

On Wed, Mar 09, 2011 at 02:39:41PM +0100, Daniel Cordey wrote:
> On Wednesday 09 March 2011 14:18:59 magnus wrote:
>
> > euh, "... | sort | uniq -c" aurait été un peu plus lisible non?
>
> Evidemment ! A force d'utiliser 'sort -u', la commande 'uniq' est un peu sorti
> de mes pensees :-)

La bonne réponse était effectivement de NE PAS ``-u'' dans sort afin
de pouvoir ``uniq -c''.

Et pourquoi pas, pour passer directement des logs vers gnuplot,
en utilisant sed plutôt que grep, avec quelque chose comme:

(Nota dans le cas présent, les dates sont encapsulées entres crochets.
 je veux compter le nombre de hits par minutes et l'adresse IP que
 je recherche est entre des espaces.)
 ``[]'' .
sed < mylog  -ne "s/^\[\([^]]*\):[0-9][0-9]\].* 192.168.2.1 .*$/\1:00/p" |
    date -uf - "%s" |
    uniq -c >mylog.dat

Ou egallement:
sed < mylog  -ne "s/^\[\([^]]*\)\].*\$/\1/" |
    date -uf - +%s/60*60 |
    bc |
    uniq -c >mylog.dat

Cette deuxième méthode présente l'avantage de permettre de modifier
la résolution de manière fine (/10 secondes, /30 minutes, etc...)

Voici le fichier de commandes gnuplot minimum:
------- mylog.plot --------
set terminal postscript enhanced color
set xdata time
set format x "%a\n%d/%m\n%H:%M"
set timefmt "%s"
plot "mylog.dat" using 2:1 title "IP 192.168.2.1 /minutes" with impulse
------- mylog.plot --------

--
 Félix Hauri  -  <felix at f-hauri.ch>  -  http://www.f-hauri.ch


More information about the gull mailing list