Contar impresiones con Perl (II)

Aquí explico como contar impresiones realizadas a través de impresoras controladas por un Windows 2003 Server con perl.

PSLOGLIST

Primero es necesario extraer del visor de sucesos, los sucesos de impresión hacia un archivo de texto. Esto lo conseguimos usando el programa psloglist, de las pstools. Por ejemplo, para sacar las impresiones de Julio:
psloglist -o Print -s -t "|" -a 06/30/12 -b 08/01/12 system > Julio.txt
Si miramos el contenido del archivo vemos que las líneas son del estilo:

3568|System|Print|INFORMATION|SERVER|31/07/2012 23:53:49|10|USER|"El documento 199,  que pertenece a USER se imprimió en IMPRESORA por el puerto IP_10.0.0.11.  Tamaño en bytes: 74249; páginas impresas: 1  "

PERL

Una vez tenemos el archivo en texto con los campos delimitados por el carácter '|' solo hace falta pasarlo por un script en perl que contabilice por Impresora-usuario:
cat Julio.txt | grep impresas | ./counter.pl

donde counter.pl:

#!/usr/bin/env perl
use strict;
use warnings;

# resultado
my %printings;

while (<STDIN>)
{
  chomp;
  (undef,undef,undef,my $tipo,undef,undef,undef, my $user, my $rest) = split(/\|/,$_,9);
  unless (($tipo =~ /WARNING/) || ($rest=~/eliminado/) || ($user =~ /SYSTEM/))
  {
   (my $printer) = ($rest =~ /en\ (\S*)\ por/);
   ($user, undef) = split(/\\/, $user,2);

    #cogemos el n. de impresiones
    my $ltotal = length $rest;
    my $imp_idx = index ($rest, "impresas:") + 10;
    my $imp = substr $rest, $imp_idx, $ltotal-$imp_idx-3;

    #hash de hashes
    if (exists $printings{"$printer"}{"$user"})
    {
        $printings{"$printer"}{"$user"} += $imp;
    }
    else
    {
        $printings{"$printer"}{"$user"} = $imp;
    }
  }
}

#imprimir el resultado
foreach my $elem (sort keys %printings)
{
   #Impresora (+ subrallar)
   print "$elem\n";
   for (my $i=0; $i < length $elem; $i++)
   {
      print "-";
   }
   print "\n";

   #impresiones de cada usuario en la impresora
   foreach my $user (sort keys %{ $printings{$elem} })
   {
      print "$user - $printings{$elem}{$user} \n";
   }

   print "\n";
}

con lo que obtenemos un resultado del estilo:

Impresora 0
-----------
user3 - 102
user1 - 1298

Impresora 1
-----------
user1 - 27
user2 - 17


Comentarios