我需要知道何时可以在经常使用的系统上进行维护。我所能检查的只是一个日志文件,在这里我可以看到用户平均何时开始和结束那里的工作。
我需要在工作日,星期六和星期日这样做。
我知道如何提取这些信息,但不知道如何将工作日与周末分开,以及如何从时间戳中建立平均值。
有人可以帮我吗?
编辑:根据要求提供更多信息
到目前为止,这是我的脚本:
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|//////////
答案 0 :(得分:0)
首先,您应该问自己是否真的要使用平均值。仅当所有用户都在早上登录,中午保持登录并在晚上退出时,才有意义。如果您整天分发注销信息,那么平均注销时间将毫无意义。 但是,即使在这种理想的情况下,您也不应在平均注销时间之后立即开始维护,因为那时仍有大约50%的用户登录。
我宁愿将登录显示为条形并手动确定良好的维护时间。 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; }
函数loginDates
和logoutDates
打印类似
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)"