Linux

Bash:計算兩個時間戳之間經過的時間

  • June 14, 2021

我編寫了一個腳本,當值不在給定範圍內時通知我。所有“超出範圍”的值都記錄在一組每日文件中。

每行都以專有的反向方式加蓋時間戳: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

我應該怎麼做才能計算兩個時間戳之間經過的時間?

這將為您提供以秒為單位的日期(從 UNIX 時代開始)

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

這將為您提供幾秒鐘內的日期作為可讀字元串

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

因此,只需將您的日期/時間戳轉換為 GNUdate可以理解的格式,使用數學來確定差異,然後輸出結果

datetime1=20170817040001
datetime2=20160312000101

# bash string manipulation
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 -nr 's/(....)(..)(..)(..)(..)(..)/\1-\2-\3 \4:\5:\6/p')
# datestamp2=$(echo "$datetime2" | sed -nr 's/(....)(..)(..)(..)(..)(..)/\1-\2-\3 \4:\5:\6/p')

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

delta=$((seconds1 - seconds2))
echo "$delta seconds"    # "45197940 seconds"

我們沒有在此處提供時區資訊,因此它假定為本地時區。您從日期時間開始的秒數可能與我的不同。(如果您的值是 UTC,那麼您可以使用date --utc。)

引用自:https://unix.stackexchange.com/questions/387010