값이 주어진 범위 내에 있지 않을 때 알려주는 스크립트를 작성했습니다. 모든 "범위를 벗어난" 값은 일일 파일 세트에 기록됩니다.
각 행은 고유한 역방향 방식(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"
따라서 필요한 것은 날짜/타임스탬프를 date
GNU가 이해하는 형식으로 변환하고 수학을 사용하여 차이를 확인한 다음 결과를 출력하는 것입니다.
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
답변3
expr
다음과 같은 명령을 사용하십시오 .
expr 20170817040001 - 20160312000101
그런 다음 두 값 사이의 차이(초)를 얻을 수 있습니다.
expr 20170817040001 - 20160312000101
10505039900