Perl tutorial: script per file find, awk/cut e somma ricorsiva
Dato che avevo l’esigenza di fare delle operazioni su directory e file e dato che questa volta preferivo usare Perl alla Bash, ho creato questo script che ha alla base delle funzioni che torneranno sicuramente utili.
Quello che a me serviva in particolar modo era riuscire, data una specifica directory, a:
1) prendere in pasto SOLO il file piu’ nuovo con nome uguale a una predefinita stringa (passata come argomento)
in bash: ls -tr “directory” | grep “stringa” | tail -1
2) leggere tale file CSV (o separato da un qualsiasi altro simbolo) e prendere solo l’ultimo campo
in bash: cat “file” | cut -d “,” -f4
3) sommare tutti gli ultimi campi assieme
in bash: expr $a + $b (ma in un loop la cosa e’ piu’ complicata)
Ed ecco come sono riuscito:
#!/usr/bin/perl
use File::Find;
use Switch;
# Le variabili in gioco
my $dir = ‘/tmp’;
my $file_pattern = $ARGV[0];
#Creo la funzione per recuperare il file piu' recente
sub lastmodifiedfile {
my $dir = shift;
-d $dir or die “‘$dir’ is not a directory\n”;
my %files;
File::Find::find (
sub {
my $name = $File::Find::name;
return unless -f $name;
#Chiedo che vengano recuperati solo i file contenenti nel nome il dato pattern
return unless $name =~ /$file_pattern/;
$files{$name} = (stat $name)[9] if -f $name;
}, $dir
);
( sort { $files{$a} <=> $files{$b} } keys %files )[-1];
}
#Questo sara' il file che dovro' parsare
my $filename = lastmodifiedfile($dir);
my @lines;
open( FILE, "< $filename" ) or die "Can't open $filename : $!";
while( <FILE> ) {
#Rimuovo la prima riga con la descrizione dei campi che non serve
s/SrcIP.*//;
next if /^(\s)*$/;
@fields = split(/,/);
#Sommo tutti i campi 4 (notare che gli array partono da 0 e non da 1
$sum += $fields[3];
}
print $sum;
close FILE;
Un file di esempio potrebbe essere il seguente:
SrcIP, StartTime, EndTime, SnmpNumResults, SnmpNumErrors, SnmpNumTimeouts
10.0.72.6,05/09/2007 08:00:00 CEST,05/09/2007 11:00:05 CEST,20,0,0
10.0.72.1,05/09/2007 08:00:00 CEST,05/09/2007 11:00:05 CEST,140,0,0
10.0.2.226,05/09/2007 08:00:00 CEST,05/09/2007 11:00:05 CEST,296,0,0
If you enjoyed this post, please consider to leave a comment or subscribe to the feed and get future articles delivered to your feed reader.




No Responses to “Perl tutorial: script per file find, awk/cut e somma ricorsiva”
No comments yet.
Leave a comment