您的位置:首页 > 运维架构 > Shell

shell脚本命令编写面试题目

2011-11-10 19:39 239 查看
一个文本类型的文件,里面每行存放一个登陆者的IP(某些行是重复的),写一个shell脚本输出登陆次数最多的用户。

PS:当时没有做出来,前段时间我再次学习shell脚本的时候想到了一种方法可以求解,但是感觉有点麻烦。在这里请教,各位对于这道题目有什么好的解法?

解法:

以下是我自己想的解法,感觉不完美,拿出来大家给瞧瞧,望多提一些意见!

假设文件中的IP是这样的,ip_input:

219.217.49.14

175.43.4.87

87.48.98.1

59.73.38.25

219.217.50.14

59.92.48.32

219.217.49.14

59.72.38.142

59.73.38.25

219.217.49.14
我们这里一步一步来

1, sort ip_input

首先使用sort命令排序,这样相同的IP地址则可以排在一起,这步我是为了接下来使用命令uniq。因为uniq命令要求是使相邻的行唯一,如果相同行之间存在其它信息,命令不会使结果“唯一”!

输出结果为:

175.43.4.87

219.217.49.14

219.217.49.14

219.217.49.14

219.217.50.14

59.72.38.142

59.73.38.25

59.73.38.25

59.92.48.32

87.48.98.1

2, sort ip_input | uniq -c

这里解释一下uniq -c 选项。它的作用是将重复行去掉并且在每行的前面添加此行重复的次数,下一步则对此结果进行排序则可以找到登录次数最多的IP记录以及登录次数。

输出结果为:

1 175.43.4.87

3 219.217.49.14

1 219.217.50.14

1 59.72.38.142

2 59.73.38.25

1 59.92.48.32

1 87.48.98.1

(在第一个出现次数之前会有很多空格,这是怎么回事呢。。。)

3, sort ip_input | uniq -c | sort -r > tmp

sort命令的默认排序方式是升序,使用 -r 选项逆序排序结果,则出现次数最多的IP则排在了第一行,并将结果保存在tmp文件当中。

4, sed -n '1p' tmp && rm -f tmp

这里的sed -n 用于将文件tmp的第一行做析取操作,此时输出结果为:

3 219.217.49.14

IP 219.217.49.14 出现的次数最多,为 3 次。

PS:在结果中,第一个数字为此IP记录在文件当中出现的次数,这里我本不想将3输出,不过我没有太好的办法解决。当然办法也是有的,不过感觉很笨拙。希望各位多提一些好的解决方案!!!

-》cat ip_input | uniq -c | sort | tail -1 | awk -f '{print $2}'

-》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: