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

原题目:

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

之前刚看到这个题目时,马上没有想到一行直接解决的办法,虽然知道可以先进行排序,但是后面由于对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命令将以重复次数作为第一列输出,然后我们使用sort命令的-k指定按照第一列进行排序,-n表示使用数值排序方法而不是默认的字符串排序,-r表示降序输出。使用head输出第一行,再用awk 输出第二列便是重复次数最多的IP地址

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值