C#, Linux Shellfebbraio 25th, 2010Alberto
Bene,
abbiamo un file di log da 600Mb con 8.791.937 milioni di righe… in formato access.log.gz fatto in questo modo:
1 2 3
| [...]
IP.IP.IPP.IPP - - [14/Sep/2009:00:01:22 +0200] "GET /xml.php/getall?cmd=tile&format=jpeg&x=3777&y=5143&z=16&extra=2&ts=256&q=60&rdr=0&sito=test HTTP/1.1" 200 1713 "http://www.ilmiosito.it/call?v=373" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; GTB6)"
[...] |
Cosa ci serve? L’url e i suoi parametri? Ok…
Da shell possiamo usare un ZCAT per leggere il file zippato senza aprirlo e magari fare un redirect con meno righe, giusto per fare dei test:
1
| $ zcat /tmp/access.log.gz | grep "&x=" | head -2500 > /tmp/small.log |
ora abbiamo un file più piccolo…
1
| cut -d\" -f2 /tmp/small.log | cut -d\? -f2 | cut -d\ -f1 > CLEAR.log |
ora abbiamo un file contenente solo l’url da parsare! Già meglio vero?
Adesso, con C# mettiamo su un parser senza perderci troppo tempo in shell e carichiamo il file!
Può essere comodo usare le liste, in modo da salvare la coppia:
(valore_che_serve),(quante_volte_si_ripete)
1
| var CityList = new Dictionary<string , int>(); |
e ovviamente salvare o incrementare i valori trovati:
1 2 3 4
| if ( ! CityList.ContainsKey( VALORE ))
CityList.Add(VALORE, 1);
else
CityList[VALORE] = CityList[VALORE] + 1; |
così abbiamo per ogni chiave il suo numero di ripetizioni!
Ma poi? Tutto disordinato?
No, no, mettiamo un pò di ordine, magari salvando un file CSV separato da “;” con i valori ordinati dal più ripetuto al memo ripetuto…
1 2 3 4 5 6 7 8
| StreamWriter sw = new StreamWriter(@"Z:\alb\ordine.dat");
foreach (KeyValuePair</string><string , int> item in CityList.OrderByDescending(key => key.Value))
{
sw.WriteLine(item.Key + ";" + item.Value);
sw.Flush();
}
sw.close(); |
Ah, per usare le Dictionary e il metodo OrderBy, sono necessarie queste due librerie:
using System.Collections.Generic;
using System.Linq;
Bene, tutto qui!
Adesso abbiamo un file CSV ordinato, con il nostro valore preferito (IP, la città, un url…) e quante volte viene ripetuto!
Per ogni utilizzo!
enjoy.
[ref -> albertopasca.it]
Apache, c#, csv, dictionary, KeyValuePair, linq, log, ordered list, parser, shell, split url, unix