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

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

値が指定された範囲内にない場合に通知するスクリプトを作成しました。すべての「範囲外」の値は、毎日のファイルセットに書き込まれます。

各行には、独自の逆方向方式(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つのタイムスタンプ間の経過時間を計算するにはどうすればよいですか?

ベストアンサー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。)

おすすめ記事