bash: 두 타임스탬프 사이의 기간이 1시간보다 깁니까?

bash: 두 타임스탬프 사이의 기간이 1시간보다 깁니까?

저는 CentOS에서 실행되는 bash 스크립트를 작성 중입니다. 이 스크립트는 먼저 응용 프로그램 세션이 시작되고 끝나는 줄을 가져온 다음 한 시간 이상 지속되면 출력합니다.

로그 파일의 타임스탬프 형식은 2017-01-03T00:00:15.529596-03:00입니다.

$i는 애플리케이션 세션 ID입니다.


이것이 내가 지금까지 가지고 있는 것입니다:

for i in $(  grep 'session-enter\|session-exit' logfile | awk '{ print $5}' ); do
                        echo ""
                        echo "*****   $i   *****"
        grep 'session-enter\|session-exit' logfile | grep $i

                start=$(grep session-enter logfile | grep $i | awk '{ print $1 }' | sed 's/-03:00//g')
                end=$(grep session-exit logfile | grep $i | awk '{ print $1 }' | sed 's/-03:00//g')

                epochStart=$(date -d "$start" +%s )
                epochEnd=$(date -d "$end" +%s )

                                duration=$( date -u -d "0 $epochEnd seconds - $epochStart seconds" +"%H:%M:%S" )

                        if [ "$epochStart"="" ] || [ "$epochEnd"="" ]
                                then
                                     echo Duration: $duration
                                else
                                     continue
                        fi


done

이에 대한 도움을 주시면 대단히 감사하겠습니다.

답변1

에포크 이후 시작 및 종료 시간을 초 단위로 저장한 것 같습니다. 이것이 사실이라면 다음을 수행할 수 있어야 합니다.

duration=$(( $epochEnd - $epochStart ))
[ $duration -gt 3600 ] && echo "Duration: $duration"

답변2

나는 입력 데이터에 대해 다음과 같은 가정을 기반으로 이 코드를 작성했습니다.

입력 파일을 스크립트에 인수로 전달

입력 파일

$ cat input
2017-01-03T00:00:15.529596-03:00 session-enter TEST1
......
.......
......
2017-01-03T00:00:37.529596-03:00 session-exit TEST1
.....
.....
2017-01-03T00:00:18.529596-03:00 session-enter TEST2
......
.......
......
2017-01-03T00:03:20.529596-03:00 session-exit TEST2
...........
..........
2017-01-03T00:00:18.529596-03:00 session-enter TEST3
......
.......
......
2017-01-03T02:03:20.529596-03:00 session-exit TEST3

extract.sh

#!/bin/bash

SESSION_LOG_FILE=${1}
SESSION_EXTRACT_FILE=/tmp/$$.txt

awk '/enter/{sname=$NF;start=$1;}/exit/ && $0~sname{end=$1;}start && end{print sname,start,end;start="";end="";}' "${SESSION_LOG_FILE}" > ${SESSION_EXTRACT_FILE}

while read SESSION_NAME SESSION_START SESSION_END
do
        echo "---------${SESSION_NAME}---------"
        echo "Start Time : ${SESSION_START}"
        echo "End   Time : ${SESSION_END}"
        START_EPOCH=${SESSION_START%-*}
        START_EPOCH=$(date -d "${START_EPOCH}" +%s)
        END_EPOCH=${SESSION_END%-*}
        END_EPOCH=$(date -d "${END_EPOCH}" +%s)
        DIFFERENCE=$((${END_EPOCH}-${START_EPOCH}))
        echo "DIFFERENCE in seconds : ${DIFFERENCE}"
done < "${SESSION_EXTRACT_FILE}"

산출

$ ./extract.sh input
---------TEST1---------
Start Time : 2017-01-03T00:00:15.529596-03:00
End   Time : 2017-01-03T00:00:37.529596-03:00
DIFFERENCE in seconds : 22
---------TEST2---------
Start Time : 2017-01-03T00:00:18.529596-03:00
End   Time : 2017-01-03T00:03:20.529596-03:00
DIFFERENCE in seconds : 182
---------TEST3---------
Start Time : 2017-01-03T00:00:18.529596-03:00
End   Time : 2017-01-03T02:03:20.529596-03:00
DIFFERENCE in seconds : 7382

시간 초가 3600보다 큰지 확인하십시오.

#!/bin/bash

SESSION_LOG_FILE=${1}
SESSION_EXTRACT_FILE=/tmp/$$.txt

awk '/enter/{sname=$NF;start=$1;}/exit/ && $0~sname{end=$1;}start && end{print sname,start,end;start="";end="";}' "${SESSION_LOG_FILE}" > ${SESSION_EXTRACT_FILE}

while read SESSION_NAME SESSION_START SESSION_END
do
        START_EPOCH=${SESSION_START%-*}
        START_EPOCH=$(date -d "${START_EPOCH}" +%s)
        END_EPOCH=${SESSION_END%-*}
        END_EPOCH=$(date -d "${END_EPOCH}" +%s)
        DIFFERENCE=$((${END_EPOCH}-${START_EPOCH}))
        if [ "${DIFFERENCE}" -gt "3600" ]
                then
                        echo "---------${SESSION_NAME}---------"
                        echo "Start Time : ${SESSION_START}"
                        echo "End   Time : ${SESSION_END}"
                        echo "DIFFERENCE in seconds : ${DIFFERENCE}"
                fi
done < "${SESSION_EXTRACT_FILE}"

관련 정보