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
コードに4つの空白を付けます。 [edit-help](http://stackoverflow.com/editing-help)を見てください。 – Cyrus
タイムスタンプに日付コンポーネントがありませんか? – codeforester