Μετρήστε και εμφανίστε τα Unique Hits με Perl και Unix!

Published by stelabouras in Coding, Internet

perl.jpgΑς υποθέσουμε οτι έχετε έναν Unix-based server στον οποίο τρέχετε apache και θέλετε να έχετε έναν γρήγορο τρόπο για να μετράτε και να σώζετε σε txt file τα unique hits συγκεκριμένων αρχείων που σας ενδιαφέρουν.

Παρακάτω θα σας παρουσιάσω πως να καταφέρετε κάτι τέτοιο με ένα απλο Perl script!

Έστω οτι το log του Apache web-server (το οποίο θα το ονομάσουμε transfer.log) βρίσκεται στον φάκελο /var/log/ και τα αρχεία είναι τα test1.mp3 test2.rar  και test3.mov

Ανοίγοντας έναν οποιονδήποτε text editor, μπορείτε να γράψετε το εξής Perl script:

$test1 =`/usr/bin/fgrep "test1.mp3" /var/log/transfer.log | cut -f1 -d" " | sort -u | wc -l`;

$test2 =`/usr/bin/fgrep "test2.rar" /var/log/transfer.log | cut -f1 -d" " | sort -u | wc -l`;

$test3 =`/usr/bin/fgrep "test3.mov" /var/log/transfer.log | cut -f1 -d" " | sort -u | wc -l`;

$body = "test1.mp3: $test1\n";
$body .= "test2.rar: $test2\n";
$body .= "test3.mov: $test3\n";

open(OUTFILE,">>hits.txt");
print OUTFILE $body;
close(OUTFILE);

Μικρό ε? Ας εξηγήσω και τί ακριβώς κάνει αυτός ο κώδικας.
Οι 3 πρώτες γραμμές κάνουν την όλη δουλειά, μια για κάθε αρχείο. Ουσιαστικά με τα ` ` αναγκάζουμε την Perl να εκτελέσει εντολή Unix.
Η εντολή αυτή (fgrep) ψάχνει μέσα στο αρχείο του log για σειρές που περιέχουν το αρχείο που μας ενδιαφέρει, στην συνέχεια (cut -f1 -d" ") απομονώνουν τις ip, τις ταξινομούν ανάλογα με το ποιές είναι οι ίδιες (sort -u) και καταμετρούν το αποτέλεσμα (wc -l)!
Αφού εκτελεστεί η παραπάνω εντολή έχουμε τον αριθμό που αντιπροσωπεύει τα unique hits για αυτό το αρχείο!

Στην συνέχεια, στο $body γράφουμε σε ένα string τα αποτελέσματα και τα περνάμε στο αρχείο hits.txt ώστε να τα έχουμε κάπου κατεγραμμένα!

Αν επίσης θέλουμε αυτό το script να τρέχει κάθε μια ώρα π.χ. , απλά στην κονσόλα γράφουμε "crontab -e" και εισάγουμε την παρακάτω γραμμή:

1       *       *       *       *       /usr/bin/perl /path_to_the_script/script.pl

Και τέλος!
Μην νομίσετε πάντως οτι ξέρω πολύ Perl,  μόνο τα βασικά, αρκετό ψάξιμο στο Google και βοήθεια απο 2 φίλους (thanks Ηλία και Γιώργο!)
Αν έχετε να προτείνετε κάτι πάνω στο post ή για script programming ρίξτε ένα comment!

Comments (4)

Βασίλης Ταράλης
November 23rd, 2006 at 12:24 pm

Perl is the only language where you can bang your head on the keyboard and it compiles !

Αυτά και πολλά άλλα τέτοια quotes από τους Φανατικούς του σπόρτ στο
http://cgi2.cs.rpi.edu/~lallip/cgi-bin/perl/fall05/quotes.cgi

Larry Wall you rock dude !

stelabouras
November 24th, 2006 at 2:30 am

Thanks για το link Βασίλη!

Όσο αναφορά το mod_perl και την php, ένα έχω να πώ:

giannis
November 24th, 2006 at 10:55 pm

Δεν βλέπω πουθενά κανά perl script :-p . Λίγο κακό bash scripting βλέπω μόνο.

Θα μπορούσες να το είχες γράψει κάπως έτσι για παράδειγμα

cat > foo.sh
#!/bin/bash

for i in $*
do
/bin/echo -ne “$i:\n”
/usr/bin/fgrep $i /var/log/transfer.log | cut -f1 -d” ” | sort -u | wc -l`;
done
^D

chmod 700 foo.sh
./foo.sh test.mp3 test.rar test.avi >> hits.txt

giannis
November 24th, 2006 at 10:59 pm

Μου έφαγε την ανάποδη slash πριν το n στο στο “$i:n”
και βγάλε το `; από το τέλος της επόμενης γραμμής.