산출

산출

입력 파일

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)

1분 이상의 지연이 감지된 각 행의 예상 출력

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

쉘 스크립트를 사용하여 이 문제를 어떻게 해결할 수 있습니까?

답변1

이것은 더 이상 sed 옵션이 아닙니다. 문자열에서 time 을 구문 분석 00:01:00하거나 60초 이상을 계산해야 합니다 00:10:00.01:00:07

나는 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 ;
}

몇 가지 팁:

  • ( $i ~ /^foo/ )i번째 필드를 foo( ^: 패턴의 시작) 와 일치시킵니다.
  • split(substr($i,6) ,A,":")배열 A의 H:M:S 부분 분할
  • A = B C: 문자열 B와 C를 A로 연결합니다.

오늘의 예는 ( u은 파일 이름이고 u.awk는 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,

답변2

sed 작업

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

어디

  • sed -e 's| ....l... | ... r ...|'sed에게 왼쪽을 오른쪽으로 바꾸라고 지시합니다.
  • ^.* .* .*$패턴을 가져옵니다( .는 임의의 문자, *임의의 숫자, sapce는 공백, $는 줄의 끝입니다)
  • \(delay=[^ ]*\) \(Hostname=[^ ]*\)필드를 사용하여 패턴을 가져오고 번호를 매깁니다.
  • \1 \2우리가 찾은 것을 바꾸세요.

편집하다: 쉼표를 제거하세요

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

어디

  • -i( )를 사용하여 sed -i -s ...파일을 그 자리에서 편집합니다.

답변3

이 명령을 시도해 보세요

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,/=|:/);열 8을 분할하고 초를 계산합니다.
  • 시간을 60초와 비교if(time_taken>60)
  • 결과 인쇄{print $5,$8,$18}

답변4

1분 이상의 지연을 얻기 위해 Perl 정규식에서 부정 예측을 사용합니다.

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/\2\1/
      s/[ ]delay=[^, ]*/\n&\n/;   s/\(\n\n.*\)\n\(.*\)\n/\2\1/
      s/[ ]Hostname=[^ ]*/\n&\n/; s/\(\n\n.*\)\n\(.*\)\n/\2\1/
   s/\n\n.*//;s/^\s*//
' yourfile

산출

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

관련 정보