이름/디렉토리가 다음과 같은 로그 파일이 있습니다. /srv/uni/kani/LogDay.09-03-2016
로그 파일의 이름은 매일 변경됩니다. 따라서 내일은 "LogDay.10-03-2016" 등이 됩니다.
파일을 조사하여 다음 줄을 찾는 스크립트를 만드는 데 도움을 받고 싶습니다.
08-03-2016 19:00:01 b5121 DISPLAY ID(IP[RANDOMIPADRESS] PID[22003]) MSG[BEGIN JOB /srv/uni/PROD/PNRUN/PN4949D
그리고 작업이 로그에 기록하는 데 걸리는 시간(분)을 측정합니다.
08-03-2016 19:19:17 b7285 DISPLAY ID(IP[RANDOMIPADRESS] JOB[FO1008] PID[28085]) MSG[END JOB /srv/uni/PROD/PNRUN/FO1008D, , 27392]
로그에는 다른 많은 줄이 있습니다. 작업 시작 및 작업 종료 등을 말하는 다른 작업입니다. 하지만 저는 이 두 특정 시간 사이의 시간을 측정하고 싶습니다.
저녁이 끝날 때 이 스크립트를 사용하여 모든 작업에 총 시간이 얼마나 걸렸는지 확인하고 싶습니다. 로그에 들어가서 수동으로 계산하는 대신...
bash 스크립트에 넣고 싶습니다 :)
나는 출력이 다음과 같기를 원합니다. 오늘 밤 작업에는 총 X시간 X분이 걸렸습니다.
누구든지 나를 도와줄 수 있나요?
답변1
#!/bin/bash
myDate=$(date +'%d-%m-%Y')
logPath='/srv/uni/kani/catalog/'
BEGINJOB="PN4949D" # Can set to $1 to accept as 1st arg
ENDJOB="FO1008D" # Can set to $2 to accept as 2nd arg
regexFirst="$myDate.*BEGIN JOB /srv/uni/PROD/PNRUN/$BEGINJOB"
regexLast="$myDate.*END JOB /srv/uni/PROD/PNRUN/$ENDJOB"
# Find First time
FIRST=$(sed -n "/$regexFirst/p" $logPathLogDay.$myDate | head -1)
FIRST=$(echo $FIRST | sed -n 's/.*\([0-2][0-9]:[0-5][0-9]:[0-5][0-9]\).*/\1/p')
echo "First job started at $FIRST"
# Find Last time
LAST=$(sed -n "/$regexLast/p" $logPathLogDay.$myDate | tail -1)
LAST=$(echo $LAST | sed -n 's/.*\([0-2][0-9]:[0-5][0-9]:[0-5][0-9]\).*/\1/p')
echo "Last job ended at $LAST"
#Compare time
# feeding variables by using read and splitting with IFS
IFS=: read first_hour first_min first_sec <<< "$FIRST"
IFS=: read last_hour last_min last_sec <<< "$LAST"
#
# the 10# is there to avoid errors with leading zeros
# by telling bash that we use base 10
total_hours=$((10#$last_hour - 10#$first_hour))
total_minutes=$((10#$last_min - 10#$first_min))
total_secs=$((10#$last_sec - 10#$first_sec))
echo "Tonight's work took $total_hours hours $total_minutes minutes and $total_secs seconds"
스크립트는 현재 날짜를 살펴보고 파일에서 해당 날짜, BEGIN의 첫 번째 발생 및 END의 마지막 발생을 검색한 다음 타임스탬프를 비교합니다.
출력은 다음과 같습니다.
첫 번째 작업은 19:00:01에 시작됩니다.
마지막 과제는 24:00:01에 종료되었습니다.
오늘 밤 작업은 5시간 0분 0초 걸렸습니다
여기에 제가 작성한 빠른 스크립트가 있습니다. 필요한 경우 이를 정리하고 출력을 수정하고 함수 등에 넣을 수 있습니다.
*편집: 또한 이 스크립트를 실행하려면 매일 원하는 시간에 실행되도록 crontab에 추가하세요.
**편집: 시작 및 종료 정규식에 대한 변수를 추가했습니다.
작업 참조 번호로 보이는 것을 변수로 변환하여 쉽게 변경하거나 매개변수로 전달할 수도 있습니다.
마지막으로 로그 경로를 변수로 만들어 쉽게 변경할 수 있도록 했습니다.
참고로 스크립트에 주석을 추가했습니다. 비록 가장 상세하지는 않지만 주석이 있으므로 스크립트를 따라가며 필요에 맞게 변경할 수 있습니다. 모든 스크립트와 마찬가지로 사용자 정의는 끝이 없습니다!
날짜를 다음과 같이 수정할 수도 있습니다. myDate=$(date --date="1 day ago" +'%d-%m-%Y')
전날의 로그를 보고 싶은 경우.