Bash: 두 타임스탬프 사이의 경과 시간 계산

Bash: 두 타임스탬프 사이의 경과 시간 계산

값이 주어진 범위 내에 있지 않을 때 알려주는 스크립트를 작성했습니다. 모든 "범위를 벗어난" 값은 일일 파일 세트에 기록됩니다.

각 행은 고유한 역방향 방식(yyyymmddHHMMSS)으로 타임스탬프가 지정됩니다.

이제 스크립트를 개선하여 지정된 범위를 벗어난 값에 대한 마지막 알림 이후 최소 60분이 경과한 후에 알림을 받고 싶습니다.

로그를 역순으로 인쇄하는 문제를 해결했습니다.

for i in $(ls -t /var/log/logfolder/*); do zcat $i|tac|grep \!\!\!|grep --color KEYFORVALUE; done

결과 :

...
20170817041001 - WARNING: KEYFORVALUE=252.36 is not between 225 and 245 (!!!)
20170817040001 - WARNING: KEYFORVALUE=254.35 is not between 225 and 245 (!!!)
20170817035001 - WARNING: KEYFORVALUE=254.55 is not between 225 and 245 (!!!)
20170817034001 - WARNING: KEYFORVALUE=254.58 is not between 225 and 245 (!!!)
20170817033001 - WARNING: KEYFORVALUE=255.32 is not between 225 and 245 (!!!)
20170817032001 - WARNING: KEYFORVALUE=254.99 is not between 225 and 245 (!!!)
20170817031001 - WARNING: KEYFORVALUE=255.95 is not between 225 and 245 (!!!)
20170817030001 - WARNING: KEYFORVALUE=255.43 is not between 225 and 245 (!!!)
20170817025001 - WARNING: KEYFORVALUE=255.26 is not between 225 and 245 (!!!)
20170817024001 - WARNING: KEYFORVALUE=255.42 is not between 225 and 245 (!!!)
20170817012001 - WARNING: KEYFORVALUE=252.04 is not between 225 and 245 (!!!)
...

어쨌든 저는 두 타임스탬프 사이의 초 수를 계산했습니다. 예를 들면 다음과 같습니다.

20170817040001
20160312000101

두 타임스탬프 사이의 경과 시간을 계산하려면 어떻게 해야 합니까?

답변1

GNU를 통해 구현되거나 호환 가능 date하며 (UNIX 시대 이후) 초 단위로 날짜를 제공합니다.

date --date '2017-08-17 04:00:01' +%s    # "1502938801"

읽을 수 있는 문자열 형식으로 날짜를 초 단위로 제공합니다.

date --date '@1502938801'    # "17 Aug 2017 04:00:01"

따라서 필요한 것은 날짜/타임스탬프를 dateGNU가 이해하는 형식으로 변환하고 수학을 사용하여 차이를 확인한 다음 결과를 출력하는 것입니다.

datetime1=20170817040001
datetime2=20160312000101

# ksh93 string manipulation (also available in bash, zsh and
# recent versions of mksh)
datestamp1="${datetime1:0:4}-${datetime1:4:2}-${datetime1:6:2} ${datetime1:8:2}:${datetime1:10:2}:${datetime1:12:2}"
datestamp2="${datetime2:0:4}-${datetime2:4:2}-${datetime2:6:2} ${datetime2:8:2}:${datetime2:10:2}:${datetime2:12:2}"

# otherwise use sed
# datestamp1=$(echo "$datetime1" | sed -nE 's/(....)(..)(..)(..)(..)(..)/\1-\2-\3 \4:\5:\6/p')
# datestamp2=$(echo "$datetime2" | sed -nE 's/(....)(..)(..)(..)(..)(..)/\1-\2-\3 \4:\5:\6/p')

seconds1=$(date --date "$datestamp1" +%s)
seconds2=$(date --date "$datestamp2" +%s)

# standard sh integer arithmetics
delta=$((seconds1 - seconds2))
echo "$delta seconds"    # "45197940 seconds"

여기서는 시간대 정보를 제공하지 않으므로 현지 시간대로 간주합니다. 귀하의 날짜/초 값은 내 값과 다를 수 있습니다. (값이 UTC인 경우 해당 을 사용할 수 있습니다 date --utc.)

답변2

datediff제공된 명령을 사용하는 것은 쉽습니다.dateutils팩.

datediff -i '%Y%m%d%H%M%S' 20170817040001 20160312000101

보다다운로드 페이지fotlr 최신 패키지 및설치 파일설치하는 방법.

당신은 또한 볼 수 있습니다프로젝트 홈페이지기타 배포 설치용.

답변3

expr다음과 같은 명령을 사용하십시오 .

expr 20170817040001 - 20160312000101

그런 다음 두 값 사이의 차이(초)를 얻을 수 있습니다.

expr 20170817040001 - 20160312000101
10505039900

관련 정보