로그 파일에서 두 작업 사이의 시간을 측정하고 싶습니다.

로그 파일에서 두 작업 사이의 시간을 측정하고 싶습니다.

이름/디렉토리가 다음과 같은 로그 파일이 있습니다. /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')전날의 로그를 보고 싶은 경우.

관련 정보