ログファイルで2つのジョブ間の時間を測定したいと思います。

ログファイルで2つのジョブ間の時間を測定したいと思います。

名前/ディレクトリが次のログファイルがあります。/srv/uni/kani/LogDay.09-03-2016 ログファイルの名前は毎日変更されます。したがって明日は「LogDay.10-03-2016」などとなります。

ファイルを調べて次の行を見つけるスクリプトを作成するのに役立ちます。

08-03-2016 19:00:01 b5121 DISPLAY ID(IP[RANDOMIPADRESS] PID[22003]) MSG[BEGIN JOB /srv/uni/PROD/PNRUN/PN4949D

そして、ジョブがログに記録するのにかかる時間(分)を測定します。

08-03-2016 19:19:17 b7285 DISPLAY ID(IP[RANDOMIPADRESS] JOB[FO1008] PID[28085]) MSG[END JOB /srv/uni/PROD/PNRUN/FO1008D, , 27392]

ログには他の多くの行があります。ジョブの開始やジョブの終了などを指す他のジョブです。しかし、私はこれら2つの特定の時間の間の時間を測定したいと思います。

夕方の終わりにこのスクリプトを使用して、すべての作業に合計時間がかかったことを確認したいと思います。ログに入って手動で計算する代わりに...

bashスクリプトに入れたいです:)

私は出力が次のようになりたいです。今夜の作業には合計X時間X分かかりました。

誰でも私を助けることができますか?

答え1

 #!/bin/bash
    
    myDate=$(date +'%d-%m-%Y')
    logPath='/srv/uni/kani/catalog/'
    BEGINJOB="PN4949D" # Can set to $1 to accept as 1st arg
    ENDJOB="FO1008D" # Can set to $2 to accept as 2nd arg
    regexFirst="$myDate.*BEGIN JOB /srv/uni/PROD/PNRUN/$BEGINJOB"
    regexLast="$myDate.*END JOB /srv/uni/PROD/PNRUN/$ENDJOB"
    # Find First time 
    FIRST=$(sed -n "/$regexFirst/p" $logPathLogDay.$myDate  | head -1)
    FIRST=$(echo $FIRST | sed -n 's/.*\([0-2][0-9]:[0-5][0-9]:[0-5][0-9]\).*/\1/p')
    echo "First job started at $FIRST"
    
    # Find Last time
    LAST=$(sed -n "/$regexLast/p" $logPathLogDay.$myDate | tail -1)
    LAST=$(echo $LAST | sed -n 's/.*\([0-2][0-9]:[0-5][0-9]:[0-5][0-9]\).*/\1/p')
    echo "Last job ended at $LAST"
    #Compare time
    # feeding variables by using read and splitting with IFS
    IFS=: read first_hour first_min first_sec <<< "$FIRST"
    IFS=: read last_hour last_min last_sec <<< "$LAST"
    
    # 
    # the 10# is there to avoid errors with leading zeros
    # by telling bash that we use base 10
    total_hours=$((10#$last_hour - 10#$first_hour))
    total_minutes=$((10#$last_min - 10#$first_min))
    total_secs=$((10#$last_sec - 10#$first_sec))
    
    echo "Tonight's work took $total_hours hours $total_minutes minutes and $total_secs seconds"

スクリプトは現在の日付を調べて、ファイルからその日付、BEGINの最初の発生、およびENDの最後の発生を検索し、タイムスタンプを比較します。

出力は次のとおりです。

最初の作業は19:00:01に開始されます。

最後の課題は24:00:01に終了しました。

今夜の作業は5時間0分0秒かかりました。

ここに私が書いたクイックスクリプトがあります。必要に応じてそれをクリーンアップし、出力を修正して関数などに入れることができます。

*編集:このスクリプトを実行するには、毎日必要な時間に実行するようにcrontabに追加してください。

**編集:開始および終了正規表現の変数を追加しました。

アクション参照番号として表示されるものを変数に変換して、簡単に変更したり、パラメータとして渡したりすることもできます。

最後に、ログパスを変数にして簡単に変更できるようにしました。

ちなみにスクリプトにコメントを追加しました。最も詳細ではありませんが、コメントがあるので、スクリプトに従い、必要に応じて変更できます。すべてのスクリプトと同様に、カスタマイズは無限です!

日付を次のように変更することもできます。myDate=$(date --date="1 day ago" +'%d-%m-%Y')前日のログを見たい場合。

関連情報