计算工作的开始和结束,日志文件中的grep

时间:2018-10-19 10:23:44

标签: bash shell

我需要知道何时可以在经常使用的系统上进行维护。我所能检查的只是一个日志文件,在这里我可以看到用户平均何时开始和结束那里的工作。
我需要在工作日,星期六和星期日这样做。
我知道如何提取这些信息,但不知道如何将工作日与周末分开,以及如何从时间戳中建立平均值。
有人可以帮我吗?

编辑:根据要求提供更多信息

到目前为止,这是我的脚本:

i=14
while i >=0
    do dow=$(date -d "-$i day" +%A)
        if [ $dow = "Saturday" ] || [ $dow = "Sunday" ]
        then i=$((i-1))
        fi
        beginnweek+=(`zgrep T400: logfile|grep -v 'T811:Icinga'|head -n 1|cut -d " " -f2`)
        endweek+=(`zgrep T400: logfile|grep -v 'T811:Icinga'|tail -n 1|cut -d " " -f2`)
        i=$((i-1))
    done

###calculate average beginn and end - Thats what missing

i=14
while i >=0
    do dow=$(date -d "-$i day" +%A)
        if [ $dow = "Monday" ] || [ $dow = "Tuesday" ] || [ $dow = "Wednesday" ] || [ $dow = "Thursday" ] || [ $dow = "Friday" ] || [ $dow = "Sunday" ]
        then i=$((i-1))
        fi
        beginnSat+=(`zgrep T400: logfile|grep -v 'T811:Icinga'|head -n 1|cut -d " " -f2`)
        endSat+=(`zgrep T400: logfile|grep -v 'T811:Icinga'|tail -n 1|cut -d " " -f2`)
        i=$((i-1))
    done

###calculate average beginn and end - Thats what missing    

i=14
while i >=0
    do dow=$(date -d "-$i day" +%A)
        if [ $dow = "Monday" ] || [ $dow = "Tuesday" ] || [ $dow = "Wednesday" ] || [ $dow = "Thursday" ] || [ $dow = "Friday" ] || [ $dow = "Saturday" ]
        then i=$((i-1))
        fi
        beginnSun+=(`zgrep T400: logfile|grep -v 'T811:Icinga'|head -n 1|cut -d " " -f2`)
        endSun+=(`zgrep T400: logfile|grep -v 'T811:Icinga'|tail -n 1|cut -d " " -f2`)
        i=$((i-1))
    done

###calculate average beginn and end - Thats what missing

我正在与
合作 GNU bash,版本4.2.46
在SLES上并带有
GNU bash,版本3.1.17

日志文件看起来像这样:

19/10/2018 04:00:03.175 : [32631] INFO  : (8) >>\\\\\\\\\\T090:NOPRINT,NOSAVE|T400:551200015480|T811:Icinga|T8904:001|T8905:001|//////////
19/10/2018 07:17:19.501 : [4935] INFO  : >>\\\\\\\\\\T021:datamax|T050:software|T051:V 1.0|T101:|T400:428568605212|T520:00000000|T510:|T500:|T545:19.10.2018||T821:DE|PRINTINFO:|PRINT1:|PRINT0:intermec pf4i.int01|//////////

1 个答案:

答案 0 :(得分:0)

首先,您应该问自己是否真的要使用平均值。仅当所有用户都在早上登录,中午保持登录并在晚上退出时,才有意义。如果您整天分发注销信息,那么平均注销时间将毫无意义。 但是,即使在这种理想的情况下,您也不应在平均注销时间之后立即开始维护,因为那时仍有大约50%的用户登录。

我宁愿将登录显示为条形并手动确定良好的维护时间。 ranwhen.py(请参见下图)是一个非常不错的工具,可以在系统启动时显示。也许您可以找到类似的登录信息或自己修改工具。

ranwhen.py

不过,这是您要的:

解析日志

我建议您使用last工具,而不是手动分析日志,该工具以更简单的格式打印最后的登录信息。由于您使用的是Linux,因此-F应该有一个last选项,以打印带有工作日前缀的日期。使用-R,我们可以抑制一些不必要的信息。 last -FR的输出如下所示:

socowi   pts/5        Fri Oct 19 17:42:16 2018   still logged in
reboot   system boot  Fri Oct 19 14:34:44 2018   still running
alice    pts/2        Fri Oct 19 10:35:05 2018 - Fri Oct 19 11:51:03 2018  (01:15)
alice    tty7         Fri Oct 19 10:24:32 2018 - Fri Oct 19 11:51:52 2018  (01:27)
bob      tty7         Fri Oct 19 10:04:21 2018 - Fri Oct 19 10:14:01 2018  (00:09)
reboot   system boot  Fri Oct 19 12:03:34 2018 - Fri Oct 19 11:51:55 2018  (00:-11)
carol    tty7         Fri Oct 19 08:10:49 2018 - down                      (01:50)
dave     tty7         Thu Oct 18 12:48:12 2018 - crash                     (04:28)

wtmp begins Tue Oct 16 12:38:03 2018

要提取有效的登录和注销日期,我们使用以下功能。

onlyUsers() { last -FR | head -n -2 | grep -Ev '^reboot '; }
onlyDates() { grep -F :; }
loginDates() { onlyUsers | cut -c 23-46 | onlyDates; }
logoutDates() { onlyUsers | cut -c 50-73 | onlyDates; }

按工作日过滤

函数loginDateslogoutDates打印类似

Fri Oct 19 17:42:16 2018
Fri Oct 19 14:34:44 2018
[...]
Thu Oct 18 12:48:12 2018

过滤特定工作日非常简单:

workweek() { grep -E 'Mon|Tue|Wed|Thu|Fri'; }
weekend() { grep -E 'Sat|Sun'; }

如果您想在周末使用所有登录日期,请输入loginDates | weekend

计算平均时间

要计算多个日期的平均时间,我们首先从日期中提取一天中的时间。然后,我们将HH:MM格式转换为午夜以来的分钟。计算列表数字的平均值很容易。然后,我们转换回HH:MM。

timeOfDay() { cut -c 12-16; }
timeToMins() { awk -F: '{print $1*60 + $2}'; }
minsToTime() { awk '{printf "%02d:%02d", $1/60, $1%60}'; }
avgMins() { awk '{s+=$1}END{printf "%d", s/NR}'; }
avgTime() { timeOfDay | timeToMins | avgMins | minsToTime; }

将所有内容放在一起

要获取平均时间,只需根据需要组合命令。一些例子:

# Average login times during workweeks 
avg="$(loginDates | workweek | avgTime)"
# Average logout times on weekends
avg="$(logoutDates | weekend | avgTime)"