国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > 互联网 > 面试笔试-脚本-1:使用shell脚本输出登录次数最多的用户

面试笔试-脚本-1:使用shell脚本输出登录次数最多的用户

来源:程序员人生   发布时间:2014-11-10 08:09:02 阅读次数:2792次

原题目:

 1个文本类型的文件,里面每行寄存1个登陆者的IP(某些行是重复的),写1个shell脚本输出登陆次数最多的用户。

之前刚看到这个题目时,马上没有想到1行直接解决的办法,虽然知道可以先进行排序,但是后面由于对uniq命令的参数不熟习,所以用了比较背的办法,就是直接编写shell脚本程序来解决这个问题。

现在假定测试数据以下:

111.111.111.111 10.10.10.10 222.222.222.222 111.111.111.111 333.333.333.333 10.10.10.10 111.111.111.111 333.333.333.333 10.10.10.10 222.222.222.222 333.333.333.333 10.10.10.10 111.111.111.111 222.222.222.222 333.333.333.333 10.10.10.10 111.111.111.111 111.111.111.111 333.333.333.333 333.333.333.333 333.333.333.333 222.222.222.222 10.10.10.10 222.222.222.222 111.111.111.111 333.333.333.333 333.333.333.333 111.111.111.111 10.10.10.10 333.333.333.333 222.222.222.222 222.222.222.222 222.222.222.222 222.222.222.222 111.111.111.111 111.111.111.111 333.333.333.333 333.333.333.333 333.333.333.333 333.333.333.333

解决此问题的脚本程序以下:

#!/bin/csh set LINES=`sort $1` set i=1 set num=`cat $1 | wc -l` set max=0 set cur="" set counter=1 set ip="" while ( $i <= $num ) if ( $LINES[$i] != $cur ) then if ( $max < $counter ) then set max=$counter set ip=$cur endif set counter=1 set cur=$LINES[$i] else @ counter++ endif @ i++ end if ( $max < $counter ) then set max=$counter set ip=$cur endif echo $ip


首先对IP地址进行排序,排序后找到重复次数最多的那个IP地址就能够了。这个逻辑上还是比较简单的。

但是如果知道可以用uniq命令输出重复的次数的话,这个问题就变得很简单了:

cat test.txt | sort | uniq -c | sort -r -n -k 1 | head -n 1 | awk '{print $2}'

uniq -c命令将以重复次数作为第1列输出,然后我们使用sort命令的-k指定依照第1列进行排序,-n表示使用数值排序方法而不是默许的字符串排序,-r表示降序输出。使用head输出第1行,再用awk 输出第2列便是重复次数最多的IP地址

生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生