红联Linux门户
Linux帮助

淘宝网招聘的面试题目---有关shell脚本的

发布时间:2009-01-10 12:31:51来源:红联作者:bitspirit
前段时间在哈工大参加淘宝网的招聘,二面的时候面试官给我出了一到shell脚本的题目,如下:
一个文本类型的文件,里面每行存放一个登陆者的IP(某些行是重复的),写一个shell脚本输出登陆次数最多的用户。

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

共有 12 条评论

  1. oceandeep 于 2009-04-21 22:51:06发表:

    dddddddddddddddddddddddddddd

  2. lizewen 于 2009-03-10 15:19:01发表:

    收下来了

  3. ShinyGuo 于 2009-03-08 22:36:33发表:

    题怎么没了

  4. 回忆是假的 于 2009-02-17 01:30:30发表:

    嗯,awk很强大,大家都应该去掌握它

  5. apple753357 于 2009-02-15 12:36:46发表:

    [i=s] 本帖最后由 apple753357 于 2009-2-15 12:40 编辑 [/i]

    如果是其它的分割符号,其实也是可以用awk的,比如读取本机的用户(用冒号分隔的)
    只要在awk中重定义分割符号如下
    cat /etc/passwd | awk ' { FS = ":" };{ print $1}'

  6. comes 于 2009-02-04 15:14:01发表:

    收下来了

  7. karon_fedora 于 2009-02-02 16:04:02发表:

    这里的awk用默认的空白作为分割符,不用作其他的操作了..

  8. karon_fedora 于 2009-02-02 16:02:22发表:

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

    不用那么麻烦的..

  9. michrykitty 于 2009-01-12 10:09:17发表:

    不错 shell的功能如此强大 受教了

  10. bitspirit 于 2009-01-11 11:50:42发表:

    嗯!!!真不错~~~我的sed和cut命令有待提高!受教啦!谢谢!(e:e2s

  11. apple753357 于 2009-01-10 23:35:20发表:

    有点复杂,命令如下
    sort input |uniq -c |sort |tail -1 |sed 's/^\ *//g' |cut -f2 -d\
    sed 's/^\ *//g' 去除每行开头空格
    cut -f2 -d\ 截取以空格为分割符号的第二个字段,\ 是引用一个空格。

    [ 本帖最后由 apple753357 于 2009-1-11 01:48 编辑 ]

  12. bitspirit 于 2009-01-10 20:46:31发表:

    以下是我自己想的解法,感觉不完美,拿出来大家给瞧瞧,望多提一些意见!
    假设文件中的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输出,不过我没有太好的办法解决。当然办法也是有的,不过感觉很笨拙。希望各位多提一些好的解决方案!!!