2016-03-21 161 views
0

我是Shell编程的新手。我试图写一个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 

,但我觉得我失去了一些东西,因为我莫名其妙地得到重复的结果。此外,我不知道如何获得以天分隔的整体计数。

回答

1

uniq的问题是它只会折叠相邻的重复行。在你的情况下,在uniq上的-d隐藏了分解重复行的行,我猜你在一天的登录尝试之间有一些类似于reboot 4.4.5-1-ARCH Wed Mar的行。您也会遇到多个用户登录分解其他用户的计数问题。

通常你会得到一个真正的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忽略匹配/秒钟内的图案线条。