我对Shell编程很陌生。我正在尝试编写一个shell脚本来计算一周中某些机器上用户的登录次数
输出应该如下所示:
123 Mon
231 Tue
555 Wed
21 Thu
44 Fri
123 Sat
10 Sun我试着用命令来完成它,最后,uniq,并按下面的方式排序
last -s -7days | awk '{print $1, $4,$5,$6}' | uniq -cd |sort -u但我想我错过了什么,因为我得到了重复的结果。此外,我也不知道如何将总计数按天数分开。
发布于 2016-03-21 16:40:46
uniq的问题是它只折叠相邻的重复行。在您的例子中,uniq上的-d隐藏了正在拆分重复行的行,我猜您在当天的登录尝试之间有一些类似于reboot 4.4.5-1-ARCH Wed Mar的行。您在多个用户登录时也会出现问题,无法将其他用户的计数分解。
通常,您需要sort | uniq来获得一个真正的uniq行列表,但是如果您删除了-d,您最终会得到不想要的行。无论是在sort | uniq之前还是之后,最好分别对它们进行过滤。
最后,如果两行恰好匹配,最后一个sort -u将删除数据,我认为这不是您想要的。相反,最好对date列进行排序(在月滚动时会导致一个小问题),或者如果您需要对计数进行排序,则使用-k FILENUM参数的另一列进行排序。
把这些结合在一起,你就可以得到:
last -s -7days | awk '/reboot/ {next}; /wtmp/ {next}; /^$/ {next}; {print $1, $4,$5,$6}' | sort | uniq -c | sort -k 5注意,.../reboot/ {next};...会导致awk忽略与/中的模式匹配的行。
https://stackoverflow.com/questions/36134450
复制相似问题