입력 파일
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