我有一个日志文件,其名称/目录是:/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]
日志中有很多其他行..其他作业说开始作业和结束作业等等。但我想测量这两个特定的时间之间的时间。
我想在晚上结束时使用这个脚本来查看所有工作总共花了多长时间。而不必进入日志并手动计数......
我想把它放在 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')
如果您希望查看前一天的日志。