原题目:
一个文本类型的文件,里面每行存放一个登陆者的IP(某些行是反复的),写一个shell脚本输出登陆次数最多的用户。
之前刚看到这个题目时,立即没有想到一行直接解决的办法,尽管知道能够先进行排序,可是后面因为对uniq命令的參数不熟悉,所以用了比較背的办法,就是直接编写shell脚本程序来解决问题。
如今如果測试数据例如以下:
111.111.111.11110.10.10.10222.222.222.222111.111.111.111333.333.333.33310.10.10.10111.111.111.111333.333.333.33310.10.10.10222.222.222.222333.333.333.33310.10.10.10111.111.111.111222.222.222.222333.333.333.33310.10.10.10111.111.111.111111.111.111.111333.333.333.333333.333.333.333333.333.333.333222.222.222.22210.10.10.10222.222.222.222111.111.111.111333.333.333.333333.333.333.333111.111.111.11110.10.10.10333.333.333.333222.222.222.222222.222.222.222222.222.222.222222.222.222.222111.111.111.111111.111.111.111333.333.333.333333.333.333.333333.333.333.333333.333.333.333
解决此问题的脚本程序例如以下:
#!/bin/cshset LINES=`sort $1`set i=1set num=`cat $1 | wc -l`set max=0set cur=""set counter=1set 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++ endif ( $max < $counter ) then set max=$counter set ip=$curendifecho $ip
首先对IP地址进行排序,排序后找到反复次数最多的那个IP地址就能够了。这个逻辑上还是比較简单的。
可是假设知道能够用uniq命令输出反复的次数的话,这个问题就变得非常easy了:
cat test.txt | sort | uniq -c | sort -r -n -k 1 | head -n 1 | awk '{print $2}'
uniq -c命令将以反复次数作为第一列输出。然后我们使用sort命令的-k指定依照第一列进行排序。-n表示使用数值排序方法而不是默认的字符串排序,-r表示降序输出。
使用head输出第一行,再用awk 输出第二列便是反复次数最多的IP地址