web-dev-qa-db-ja.com

Bash:2つのタイムスタンプ間の経過時間を計算します

値が指定された範囲内にない場合に通知するスクリプトを作成しました。 「範囲外」の値はすべて、1組の1日あたりのファイルに記録されます。

すべての行に独自の逆の方法でタイムスタンプが付けられます: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 (!!!)
...

とにかく、私はそれらの2つのタイムスタンプの間の秒数を計算することに行き詰まっています。例えば:

20170817040001
20160312000101

2つのタイムスタンプ間の経過時間を計算するにはどうすればよいですか?

4
Marco

これにより、日付が秒単位で表示されます(UNIXエポック以降)。

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

そして、これはあなたに秒数から読みやすい文字列として日付を与えます

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

したがって、必要なのは、日付/タイムスタンプをGNU dateが理解できる形式に変換し、数学を使用して違いを判別し、結果を出力することです。

datetime1=20170817040001
datetime2=20160312000101

seconds1=$(date --date "$(echo "$datetime1" | sed -nr 's/(....)(..)(..)(..)(..)(..)/\1-\2-\3 \4:\5:\6/p')" +%s)
seconds2=$(date --date "$(echo "$datetime2" | sed -nr 's/(....)(..)(..)(..)(..)(..)/\1-\2-\3 \4:\5:\6/p')" +%s)

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

ここではタイムゾーン情報を提供していないため、ローカルのタイムゾーンを想定しています。日時からの秒数の値はおそらく私のものとは異なります。 (値がUTCの場合、date --utc。)

8
roaima

これは datediff パッケージで提供されるdateutilsコマンドで簡単です。

ddiff -i '%Y%m%d%H%M%S' 20170817040001 20160312000101
6
αғsнιη