2017-01-31 6 views
0

私のログで、アプリケーションがダウンしてバックアップされた(アプリケーションの可用性)タイムスタンプをチェックするスクリプトがあります。
私はタイムスタンプのリストの違いを見つけて、それらの違いをすべて追加したいので、アプリがダウンした総時間を知りたいと思います。だから、downtime.txtファイルには、このようなリストがあります:
4時55分51秒
5時41分51秒
をしてuptime.txtは、同じ形式のようなリストがあります:
4時56分59秒
05:42:21bashでお互いにタイムスタンプの2つのリストを差し引く

タイムスタンプを算術演算用の数値に変換する必要がないとすれば、私はできると思います。
paste downtime.txt uptime.txt | awk '{print $ 1 - $ 2}'> timedown.txt
などです。タイムスタンプを読み取って数値に変換し、2つのファイルから一致する行を減算し、それらの行の合計を合計するにはどうすればよいですか?

+0

コードに4つの空白を付けます。 [edit-help](http://stackoverflow.com/editing-help)を見てください。 – Cyrus

+0

タイムスタンプに日付コンポーネントがありませんか? – codeforester

答えて

0

dateコマンドを使用すると、タイムスタンプを変換できます。残念ながら、タイムスタンプには日付がありません。過去の深夜に転がったときに何が起こるのかわからないのですが、その問題がないと仮定すると、計算目的で固定日付「01-Jan-1970 UTC」を選択できます。

paste downtime.txt uptime.txt | while read d u; do echo $(($(date -d "01-Jan-1970 UTC $u" +%s) - $(date -d "01-Jan-1970 UTC $d" +%s))); done 

説明:

はここにあなたのコードですdateコマンドは、秒にタイムスタンプを変換します。 -dオプションは、「今」の代わりに次の日付に動作することを意味します。したがって、指定された時刻が真夜中からのものであると仮定して、入力ファイルを使用して日付を与えます。 dateは1970年1月1日00:00:00から秒単位で動作するため、結果を簡略化するためにその日付を追加します。 +%sパラメータは、1970年1月1日以降の秒数を示します。ここで変換が行われます。-dを指定してから、「now」の代わりに指定したタイムスタンプが使用されます。したがって、$(date -d "01-Jan-1970 UTC $u" +%s)の値は、稼働時間の真夜中からの秒数です。そして、2つのタイムスタンプ間の秒数を取得するために、稼働時間秒からダウンタ​​イム秒を差し引いて、$((...))を使用します。 (あなたのbashにその機能がない場合は、代わりに$(expr $(date -d "01-Jan-1970 UTC $u" +%s) - $(date -d "01-Jan-1970 UTC $d" +%s))を使うことができます)。

更新:私は仕事を終了する必要があります。合計時間を累積してカウントするには、| awk '{total=total+$1} END {print $total}'を追加します。これを時間と分に変換するには、dateを再度使用してください。 -uオプションを使用して、現地時間への変換を防止する-dオプション(@)を使用して秒数を指定します(これは、1970年1月1日をベースに使用します。つまり、@を意味します)。+%Tは、 24時間以上経過していれば余分な日数は失われます。

date -u -d @$(paste downtime.txt uptime.txt | while read d u; do echo $(($(date -d "01-Jan-1970 UTC $u" +%s) - $(date -d "01-Jan-1970 UTC $d" +%s))); done | awk '{total=total+$1} END {print total}') +%T 
+1

私はawkを使って3600分と60分を乗算し、それらを加算しましたが、私はdateコマンドが好きです。私はもともとタイムスタンプを隔離しましたが、スクリプトに日付も含めておくことで、深夜の前後に物事を記録することができます。あなたが私の問題を教えてくれてありがとう! – rensozo

関連する問題