[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

RE: Script para Visualizar la cola de correos filtrada



> El Thu, 11 Sep 2008 17:45:51 +0200
> "Gorka" <gorkalinux@yahoo.es> escribi�:
> 
> > Tengo postfix y trato de crear un script que me devuelva ?el p�rrafo
> > completo de cada mensaje?, en la cola mailq, donde el remitente
> cumpla
> > cierto patr�n. Mi problema es que quiero el p�rrafo completo, es
> decir, las
> > 3 l�neas, no s�lo la primera. No s� c�mo hacerlo. Adem�s luego los
> elimina,
> > esto �ltimo es muy f�cil.
> >
> > Me explico mejor, si tengo 30 mensajes encolados y dos proceden de
> > mimial@yahoo.es, quiero visualizar s�lo la informaci�n de estos dos y
> luego
> > borrarlos. As�:
> >
> > #./script.sh mimail@yahoo.es
> >
> > 8F464D38003    20534 Thu Sep 11 17:18:39  mimail@yahoo.es
> >                      (connect to correo.es[222.222.88.88]: Connection
> > refused)
> >                                          p2@correo.es
> >
> > 035FFD38002    20546 Thu Sep 11 17:18:31  mimail@yahoo.es
> >                      (connect to correo.es[222.222.88.88]: Connection
> > refused)
> >                                          p1@correo.es
> >
> > Se borraron 2 mensajes.
> >
> >
> > Mi c�digo, como pod�is ver no me visualiza la l�nea segunda y
> tercera.
> > Contenido de script.sh:
> >
> > #!/bin/bash
> >
> > #Visualiza
> > mailq | grep $1
> >
> > #Elimina
> > mailq | grep $1 | awk '{ print $1 }' | tr -d '*!' | postsuper -d -
> >
> > �C�mo puedo conseguirlo? �A lo mejor alguien ha ideado algo en perl?
> >
> >
> >
> >
> 
> Tu problema es que tambi�n quieres mostrar las dos l�neas anteriores a
> la del patr�n encontrado, �no?. Para ello puedes usar el par�mtro -B
> (before) con grep
> 
> #Visualiza
>  mailq | grep -B 2 $1
> 
> Hay bastante m�s ayuda en las p�ginas de manual.
> 

Finalmente lo he resuelto con perl. Otro compañero del foro me pide el código. Aquí lo dejo, por si a alguien le sirve. Me hubiera gustado resolverlo sin necesidad de utilizar el fichero spam.txt, pero no he sabido cómo pasarle directamente el array de ids a postsuper. Hay otro hilo por ahí donde lancé esa duda. El código:

  for (my $i=0;$i<=$#linea;$i++)
  {
    @fila = split (/\s+/,$linea[$i]);
    if ($fila[2] eq "Mon" || $fila[2] eq "Tue" || $fila[2] eq "Wed" || $fila[2] eq "Thu" || $fila[2] eq "Fri" || $fila[2] eq "Sat" || $fila[2] eq "Sun")
    {
      if (index($fila[6],$patron) != -1)
      {
        #Archivar Id
        push(@ids,$fila[0]);
                  
        #Archivar 4 lineas.
        if ($#impresion <= 0)
        {
          push(@impresion,@linea[0]."\n");
        }
        push(@impresion,$linea[$i]); 
        push(@impresion,$linea[$i+1]);
        push(@impresion,$linea[$i+2]);
        push(@impresion,"\n");         
        $i = $i+3;     
      }else
      {
        #print STDOUT "No hay resultados para el patron <".$patron.">. \n\n"; 
      }
    }#si es la primera del trio
  }#por linea
      
  $coincidencias = $#ids+1;
  push(@impresion,"$coincidencias coincidencias para el patron <".$patron.">. \n");
  push(@impresion,"\n");

  #Imprime coincidencias
  for (my $i=0;$i<=$#impresion;$i++)
  {
   print $impresion[$i];
  }

  if ($coincidencias > 0)
  {
    print "\nEliminar [S/N]: ";
    $respuesta = <STDIN>;
    chop ($respuesta);

    if ($respuesta eq "S")
    {
      #Elimina resultados de la busqueda.
      open (OUT, ">", 'spam.txt') or die "Imposible abrir el archivo spam.txt";
      for (my $i=0;$i<=$#ids;$i++)
      {
        print OUT $ids[$i],"\n";
      }
      close (OUT);
      system "awk '{ print \$1 }' spam.txt | tr -d '*!' | postsuper -d -";
      print "\n";                        
    }else
    {
      print "\nOperacion cancelada.\n\n";
    }
  }#si hay coincidencias




Reply to: