プロが教えるわが家の防犯対策術!

ログなどに実行した時間と終了した時間が表示される
のですが、実行にかかった時間を計算したいと考えております。

例:
10:22:01.012,10:23:10.234
^^^^^^^^^^^^ ^^^^^^^^^^^^
↑実行時間  ↑終了時間


上記のようなログが表示される場合で、実行にかかった
時間を計算する方法はないでしょうか?
ずっと考えていたのですが、良い方法が思いつきません。perlとかでは出来そうですが、solarisで行いたいと考えています。

ご教授頂ければ幸いです。よろしくお願いします。

A 回答 (2件)

ログが複数行あるとして、


開始時刻,終了時刻 テキスト

開始時刻,終了時刻,経過時間 テキスト
に書き換えることを考えるとします。かなり面倒ですが、↓

#! /bin/sh
IFS=" :.,"
while read H1 M1 S1 T1 H2 M2 S2 T2 TEXT
do
X=`expr $H1 \* 3600000 - $M1 \* 60000 - $S1 \* 1000 + $T1`
Y=`expr $H2 \* 3600000 + $M2 \* 60000 + $S2 \* 1000 + $T2`
if test $X -gt $Y ;then Y=`expr $Y + 86400000`;fi
W=`expr $Y - $X`
T=`expr $W % 1000`
W=`expr $W / 1000`
S=`expr $W % 60`
W=`expr $W / 60`
M=`expr $W % 60`
H=`expr $W / 60`
T=`expr 00$T : '.*\(...\)'`
S=`expr 0$S : '.*\(..\)'`
M=`expr 0$M : '.*\(..\)'`
H=`expr 0$H : '.*\(..\)'`
IFS=" "
echo "$H1:$M1:$S1.$T1,$H2:$M2:$S2.$T2,$H:$M:$S.$T $TEXT"
IFS=" :.,"
done < logfile.txt >logfileout.txt
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
やはりコマンド一発で実行するのは無理っぽいですね。
簡単な処理を複数組み合わせてシェルを作成するの方法が一番よいですね。
ありがとうございます。大変参考になりました。

お礼日時:2005/06/18 00:20

簡単なコマンドしか知らないので、シンプルなコマンドで単純に考えました。



1秒=1000ミリ秒
1分=60秒=60000ミリ秒
1時間=60分=3600秒=3600000ミリ秒

ログファイル(time.log)内には、質問文内の例にあった「開始」「終了」時間のみが記述されているとしました。
「cut」コマンドで開始・終了の区切り文字を「,」、時・分・秒の区切り文字を「:」、ミリ秒の区切り文字を「.」としました。

ちなみに、23時→0時の日付またがりは考慮していません。

以下、Cシェル

#!/bin/csh

#--------------------------------------------
# ログファイルより、開始・終了時間を取り出す
#--------------------------------------------
set START = `cat time.log | cut -d',' -f1`
set END = `cat time.log | cut -d',' -f2`

#--------------------------------------------
# 取り出した開始時間を、時・分・秒・ミリ秒に切り分ける
#--------------------------------------------
set START_HH = `echo ${START} | cut -d':' -f1`
set START_MM = `echo ${START} | cut -d':' -f2`
set START_SS = `echo ${START} | cut -d':' -f3 | cut -d'.' -f1`
set START_MS = `echo ${START} | cut -d'.' -f2`

#--------------------------------------------
# 切り分けた時・分・秒・ミリ秒をすべてミリ秒に置き換える
#--------------------------------------------
@ START_HH_MS = ${START_HH} \* 3600000
@ START_MM_MS = ${START_MM} \* 60000
@ START_SS_MS = ${START_SS} \* 1000

#--------------------------------------------
# 置き換えた時・分・秒・ミリ秒の和をもとめる
#--------------------------------------------
@ START_TOTAL = ${START_HH_MS} + ${START_MM_MS} + ${START_SS_MS} + ${START_MS}

~~ END_TOTAL も同様に ~~

#--------------------------------------------
# 終了時間-開始時間で、実行時間をもとめる
#--------------------------------------------
@ ELAPS_MS = ${END_TOTAL} - ${START_TOTAL}

~~ これで実行時間のミリ秒がでる ~~
~~ 秒単位にする場合は、更に1000で割る ~~

どうでしょうか?理屈が簡単な分、処理が多いのが難点です。実はコマンド1発で答えがでたりするかも…。でも、自分の持っている知識だと、この回答が精一杯です。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
この方法でやれば、処理が簡単なのですぐ作成できそうです。大変参考になりました。ありがとうございます。

お礼日時:2005/06/18 00:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!