Unix 명령을 사용하여 구문 분석해야 하는 로그 파일이 있습니다.
행 간의 시간 차이를 계산해야 하며 마지막으로 트랜잭션 간의 MIN, MAX 및 AVG 시간과 MIN의 ID 번호를 표시해야 합니다.
내 스크립트는 내가 작성한 모든 작업을 수행하고 MIN의 ID 번호를 허용하지만 그 이유를 이해할 수 없습니다.
- 로그 파일 예:
03/22 08:51:01.050 INFO :1000 :.main: *************** RSVP Agent started *************** 03/22 08:51:01.532 INFO :1001 :...locate_configFile: Specified configuration file: /u/user10/rsvpd1.conf WARNING 03/22 08:51:01.405 INFO :1002 :.main: Using log level 511 03/22 08:51:01.970 INFO :1003 :..settcpimage: Get TCP images rc - EDC8112I Operation not supported on socket. 03/22 08:51:01.837 INFO :1004 :..settcpimage: Associate with TCP/IP image name = TCPCS 03/22 08:51:02.100 INFO :1005 :..reg_process: registering WARNING process with the system 03/22 08:51:02.524 INFO :1006 :..reg_process: attempt OS/390 registration 03/22 08:51:02.748 INFO :1007 :..reg_process: return from registration rc=0 03/22 08:51:06.624 TRACE :1008 :.....starting_transaction: calling API: status: START 03/22 08:51:06.123 INFO :1009 :...read_physical_netif: index #0, interface VLINK1 has address 129.1.1.1, ifidx 0 03/22 08:51:06.524 INFO :1010 :...read_physical_netif: index #1, interface TR1 has address 9.37.65.139, ifidx 1 03/22 08:51:06.367 INFO :1011 :...read_physical_netif: index #2, interface LINK11 has address 9.67.100.1, ifidx 2 03/22 08:51:06.748 INFO :1012 :...read_physical_netif: index #3, interface LINK12 has address 9.67.101.1, ifidx 3 03/22 08:51:06.965 INFO :1013 :...read_physical_netif: index #4, interface CTCD0 has address 9.67.116.98, ifidx 4 03/22 08:51:06.010 INFO :1014 :...read_physical_netif: index #5, interface CTCD2 has address 9.67.117.98, ifidx 5 03/22 08:51:06.050 INFO :1015 :...read_physical_netif: index #6, interface LOOPBACK has address 127.0.0.1, ifidx 0 03/22 08:51:06.100 INFO :1016 :....mailslot_create: creating mailslot for timer 03/22 08:51:06.724 INFO :1017 :.....ending_transaction: calling API: status: END 03/22 08:51:06.970 INFO :1018 :.....mailslot_create: creating mailslot for RSVP 03/22 08:51:06.160 INFO :1019 :....mailbox_register: mailbox allocated for rsvp
- 내 스크립트:
for i in log-file.txt do cat log-file.txt | grep -E "starting_transaction|ending_transaction" >> transactions.txt | awk '{print $2}' <transactions.txt >global-time.txt awk -F: '{ print ($1 * 3600) + ($2 * 60) + $3 }' <global-time.txt >seconds-time.txt awk 'NR > 1 { print $0 - prev } { prev = $0 }' <seconds-time.txt >difference-time.txt awk '{print $4}' <transactions.txt >trans-id.txt | paste difference-time.txt trans-id.txt > diff-transid.txt awk '{if(min==""){min=max=$1 $2}; if($1>max) {max=$1 $2}; if($1<min) {min=$1 $2}; total+=$1; count+=1} END {print "avg " total/count," | max " max," | min " min " | minID " $2}' <diff-transid.txt >final-answer.txt done
- 내가 얻은 결과는 다음과 같습니다.
avg 11.1467 | max 99.1 | min 0.1 | minID
- 내가 필요한 결과는 다음과 같습니다.
avg 11.1467 | max 99.1 | min 0.1 | minID 1017
답변1
달성하려는 작업은 awk
스크립트에서 완전히 수행할 수 있으며 이는 텍스트 처리에 셸 루프를 사용하는 것보다 훨씬 효율적입니다. 나는 다음 프로그램을 추천합니다(우리는 이것을 이라고 부릅니다 analyze_timing.awk
):
#!/usr/bin/awk -f
function timediff(start,end, stfld,endfld,diff) {
split(start,stfld, /:/)
split(end, endfld,/:/)
if (endfld[1]<stfld[1]) {
diff=(3600*(endfld[1]+24) + 60*endfld[2] + endfld[3])
}
else {
diff=(3600*endfld[1] + 60*endfld[2] + endfld[3])
}
diff -= (3600*stfld[1] + 60*stfld[2] + stfld[3])
return diff
}
$5 ~ /^:\.+starting_transaction/ {laststart=$2;next}
$5 ~ /^:\.+ending_transaction/ {
n_transact++
duration=timediff(laststart, $2)
avg+=duration
if (n_transact==1) {
shortest=duration
longest=duration
min_id=substr($4,2)
}
else {
if (duration<shortest) {
shortest=duration
min_id=substr($4,2)
} else if (duration>longest) {
longest=duration
}
}
}
END {
printf("avg: %f | max: %f | min: %f | minID: %d\n", avg/n_transact, longest, shortest, min_id)
}
timediff()
예제에 표시된 대로 먼저 두 타임스탬프 사이의 경과 시간을 계산하는 함수를 정의합니다 . 단순화를 위해 트랜잭션이 24시간 이내에 완료된다고 가정합니다.
starting_transaction
그런 다음 행의 5번째 필드가 a :
및 임의의 숫자 로 시작하는지 확인 .
하고 변수에 시간을 기록합니다 laststart
. 다섯 번째 필드도 로 시작하는 경우 ending_transaction
차이를 계산 laststart
하고 최소/최대/평균을 계산하는 데 사용되는 변수를 채웁니다. 지금까지의 거래 중 가장 짧은 거래라면 ID가 에 기록됩니다 min_id
.
마지막으로 프로그램은 필요에 따라 요약을 인쇄합니다.
당신은 그것을 부를 것입니다
awk -f analyze_timing.awk log-file.txt