Obtenha uma palavra específica e siga o texto

0

Arquivo de entrada

Mar 21 13:25:04 ip-172-2-0-53 sendmail[5857]: v2LKMUDq005855: to=<[email protected]>,<[email protected]>, delay=00:02:34, xdelay=00:02:34, mailer=esmtp, pri=151745, relay=icadmed-com.mail.p...ction.googlemail.com. [xxx.xx.xxx.xxx], dsn=2.0.0, stat=Sent (<[email protected]> [InternalId=76295799050449, Hostname=BY1PR0701MB1752.namprd07.prod.gmail.com] 8962 bytes in 0.961, 9.102 KB/sec Queued mail for delivery)
Mar 21 11:34:55 ip-172-2-0-53 sendmail[5478]: v2LIXc00005476: to=<[email protected]>, delay=00:01:17, xdelay=00:01:17, mailer=esmtp, pri=120883, relay=gmail-com.mail.p...ction.googlemail.com. [xxx.xx.xxx.xx], dsn=2.0.0, stat=Sent (<[email protected]> [InternalId=79285096289546, Hostname=CY1PR07MB1448.namprd07.prod.googlemail.com] 8049 bytes in 0.226, 34.732 KB/sec Queued mail for delivery)
Mar 20 13:45:16 ip-172-2-0-53 sendmail[1295]: v2KKfjCN001293: to=<[email protected]>, delay=00:03:31, xdelay=00:03:31, mailer=esmtp, pri=120883, relay=mta5.am0.yahoodns.net. [xx.xxx.xx.xx], dsn=2.0.0, stat=Sent (ok dirdel)
Mar 20 08:54:57 ip-172-2-0-53 sendmail[32712]: v2KFss7V032710: to=<[email protected]>, delay=00:00:03, xdelay=00:00:03, mailer=esmtp, pri=120892, relay=mx4.hotmail.com. [xxx.xxx.xx.xxx], dsn=2.0.0, stat=Sent ( <[email protected]> Queued mail for delivery)

e Saída esperada para cada linha que eu detecto atraso mais de 1 minuto

sendmail[5857]: delay=00:02:34 Hostname=BY1PR0701MB1752.namprd07.prod.gmail.com]
sendmail[5478]: delay=00:01:17 Hostname=CY1PR07MB1448.namprd07.prod.googlemail.com]
sendmail[1295]: delay=00:03:31

como posso resolver isso usando um script de shell?

    
por Mahesh Phate 30.03.2017 / 15:01

4 respostas

2

esta não é mais uma opção sed. você deve analisar a string onde o tempo é 00:01:00 , 00:10:00 ou 01:00:07 para contar mais que 60s.

Eu criei um arquivo awk

 { result = "" ;
   for (i=1;i<=NF;i++) {
     if ( $i ~ /^delay=/ ) {
       s=split(substr($i,6) ,A,":") ;
       t=60*A[1]+A[2] ;
       #printf "%2d : %d mn (60x%s+%s) : %s\n",i,t,A[1],A[2],$i ;
       if ( !t  ) next ;
       result = $i ;
     }
     if ( $i ~ /^Hostname/ ) result = result $i ;

  }
  if ( result != "" ) print result ;
}

alguma dica:

  • ( $i ~ /^foo/ ) corresponde ao campo i-ésimo com foo ( ^ : início do padrão)
  • split(substr($i,6) ,A,":") split H: M: S parte no array A
  • A = B C : concatenar cadeia B e C para A

com a amostra de hoje, isso dá ( u sendo o nome do arquivo, u.awk sendo o arquivo que armazena o programa awk)

 awk -f u.awk u
delay=00:02:34, Hostname=BY1PR0701MB1752.namprd07.prod.gmail.com]
delay=00:01:17, Hostname=CY1PR07MB1448.namprd07.prod.googlemail.com]
delay=00:03:31,
    
por 31.03.2017 / 11:51
2

um trabalho para sed

sed -e 's|^.* \(delay=[^ ]*\) .*\(Hostname=[^ ]*\) .*$| |'  file

onde

  • sed -e 's| ....l... | ... r ...|' tell sed para substituir o lado esquerdo, pelo lado direito.
  • ^.* .* .*$ padrão de obtenção ( . é qualquer caractere, * qualquer número, sapce é espaço, $ é o fim da linha)
  • \(delay=[^ ]*\) \(Hostname=[^ ]*\) padrão de captura com campo (e obtê-los numerados)
  • substitui o que encontramos.

edit : livrando-se da vírgula

sed -e 's|^.* \(delay=[^,]*\), .*\(Hostname=[^ ]*\) .*$| |' u

onde

  • use -i ( sed -i -s ... ) para editar o arquivo no lugar
por 30.03.2017 / 15:11
0

Tente este comando

awk '{split($8,a,/=|:/);time_taken=a[2]*3600+a[3]*60+a[4]+0;if(time_taken>60){print $5,$8,$18}}' your_file.txt
  • split($8,a,/=|:/); divide a 8ª coluna e calcula os segundos.
  • compare o tempo com 60 segundos if(time_taken>60)
  • imprima os resultados {print $5,$8,$18}
por 31.03.2017 / 11:51
0

We use negative lookahead in Perl regex to get the delays > 1 min

perl -lane '
   BEGIN{
      $,=$";
      $dly=qr/\bdelay=(?!00:(?:00:[0-5][0-9]|01:00))(?:\d\d:\d\d:\d\d)(?=,)/;
   }
   /$dly/ and print /\b(?:Hostname|sendmail)\S+|$dly/g;
' yourfile

sed -e '
   # logic for selecting entries where delay > 1 min
   /[ ]delay=[0-9][0-9]:[0-9][0-9]:[0-9][0-9],/!d
   /[ ]delay=[0][0]:[0][0]:[0-5][0-9],/d
   /[ ]delay=[0][0]:[0][1]:[0][0],/d

   # we are here => delay > 1 min, now fish out the entries...
   s/^/\n\n/
      s/[ ]sendmail[^ ]*/\n&\n/;  s/\(\n\n.*\)\n\(.*\)\n//
      s/[ ]delay=[^, ]*/\n&\n/;   s/\(\n\n.*\)\n\(.*\)\n//
      s/[ ]Hostname=[^ ]*/\n&\n/; s/\(\n\n.*\)\n\(.*\)\n//
   s/\n\n.*//;s/^\s*//
' yourfile

Saída

sendmail[5857]: delay=00:02:34 Hostname=BY1PR0701MB1752.namprd07.prod.gmail.com]
sendmail[5478]: delay=00:01:17 Hostname=CY1PR07MB1448.namprd07.prod.googlemail.com]
sendmail[1295]: delay=00:03:31
    
por 31.03.2017 / 18:28