我是Shell编程的新手。我尝试编写一个shell脚本来计算某些机器上用户每周每天的登录次数
输出应如下所示:
123 Mon
231 Tue
555 Wed
21 Thu
44 Fri
123 Sat
10 Sun
我尝试使用命令last,uniq并按此类排序
last -s -7days | awk '{print $1, $4,$5,$6}' | uniq -cd |sort -u
但我认为我错过了一些东西,因为我以某种方式获得了重复的结果。另外,我不确定如何将总计数除以天数。
答案 0 :(得分:1)
uniq
的问题是它只会折叠相邻的重复行。在你的情况下,uniq上的-d
隐藏了分解重复行的行,我猜你在当天的登录尝试之间有一些类似于reboot 4.4.5-1-ARCH Wed Mar
的行。您也会遇到多个用户登录分解其他用户的计数的问题。
通常你sort | uniq
获取uniq行的真实列表,但是如果删除-d,你最终会得到你不想要的行。最好在sort | uniq
之前或之后单独筛选出这些内容。
最后,如果两行恰好匹配,最后sort -u
将删除数据,我不认为这是你想要的。相反,如果您需要对计数进行排序,最好对日期列进行排序(在月份翻转时会导致一个小问题),或者使用-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忽略与/
中的模式匹配的行。