标签:正则表达式 开发 shell 面试题 sedlinux-shell面试题 之三_面试

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://president.blog.51cto.com/4990508/854647
       由于工作的关系,收集了很多的shell面试题,有些比较有意思,有些纯粹是为折磨人用的题目。有的看完会心一笑,有的看了之后会以为是几年前开发的面试题。不知道是会的人多了,还是有意的为难,想起一句话,庙小妖风大,水浅那个啥多。 
      多说一句,解决的方法有很多种,也许这里给出的答案并不是最优的,但应该是比较容易解释,容易理解的。具体是什么公司的面试题就不说了,毕竟是人家的隐私。
       这篇内容中所涉及的知识点比较多,设置的陷阱更是不少,可以感觉到出题人的挖空心思,可以考验出答题人对于系统,对于实际环境的管理能力及功底。   
 
1.如下是对api接口日志的截取,存放在check.log文件中
22:57:36|check|por1|117.136.15.67|4|username|fail|5|29|
22:57:36|check|por1|183.1.94.215|4|username|succ|1644841971|14|
22:57:36|check|pro2|0.0.0.0| |username|succ|162885433|6|
22:57:36|check|por2|0.0.0.0|9|username|fail|-4038|0|
22:57:36|check|por3|120.11.82.19|2|username|fail|5|49|
22:57:36|check|por4|172.16.86.82|0|username|succ|1548062613|1|
22:57:36|check|por2|123.125.156.135|9| |succ|1632786393|1|
22:57:36|check|por5|124.231.21.100|5|username|succ|224803739|3|
22:57:36|check|por4|172.16.86.82|0|username|succ|1505887155|1|
22:57:36|check|por2|0.0.0.0|9|username|succ|1343846051|1|
22:57:36|check|por6|113.193.202.138|8|username|succ|1729273615|1|
22:57:36|check|por6|116.75.149.20|8|username|succ|1729981552|1|
22:57:36|check|por5|116.5.164.94|5|username|succ|214405328|1|
22:57:36|check|por2|0.0.0.0|9|username|succ|1433162137|1|
22:57:36|check|por3|218.69.6.30|5|username|succ|28725136|42|
22:57:36|check|por2|0.0.0.0|8| |fail|5|4|
22:57:36|check|por5|123.115.102.222|5|243905232|succ|243905232|1|
22:57:36|check|por4|172.16.86.82|0|1011711900|succ|1011711900|39|
日志各字段代表的意义如下:
时间|接口名称|使用该接口的产品名称|调用接口的IP地址|用户类型|用户账号名称|接口返回结果(succ or fail)|当接口返回结果为“succ”时,该字段为用

户唯一编号;当接口返回结果为“fail”时,该字段为接口返回的错误代号|接口执行时间(毫秒级别)
问题:请使用shell命令的组合得到每个产品调用该接口成功时接口的平均执行速度,并按照执行速度由低到高排序(注:用户类型和用户账号名称为空的访问不

计算在内),以如下格式输出:
pro1 :0.0714286
pro2 :0.3333333
pro3 :0.0238095
pro4 :0.0731707
pro5 :0.6
pro6 :1

一句话思路:有计算、有排序,awk是唯一选择。统计总数的同时,还要统计出现次数,最后进行计算。
awk -F "|" '$(NF-3)~/succ/{por[$3]=por[$3]+$(NF-1);sum[$3]++}END{for(var in por)print var" :"por[var]/sum[var] | " sort -k2 -nr"}' check.log
 
知识点:awk数组,awk管道,为避免不等长使用NF变量

2.用一行命令实现:查找当前目录下(含子目录),文件内容中含有sina且文件名以".config"结尾的文件
一句话思路:批量按规则查找文件内容grep
grep -lr "sina" ./ | grep -P "(.*)(\.config$)"
知识点:grep -r 递归查找,-P支持perl正则表达式

3.用shell查询以“.”结尾的文件,并加上后缀“.ts”
一句话思路:在之前的曾经有过批量修改扩展名的实例,但这次有所不同,使用find命令就可以搞定

find ./ -name "*." -exec mv {} {}ts \;
知识点:find命令

4.假定某个web服务器访问log其中一行如下:

61.159.245.95 - - [30/Apr/2003:01:04:20 +0800] "GET / HTTP/1.1" 200 151 "http://www.baidu.com" "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 

6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3; 

360SE)"
该LOG文件超过10万行,如果列出最后的10万行中请求最多前十位IP,显示如下的结果:
119 211.101.169.200
103 211.101.169.206
50 61.149.38.249
11 202.106.138.194
请用一行命令显示出上面的结果
 
一句话思路:之前有过类似的,这里不再赘述
awk '{ip[$1]++}END{for(var in ip)print ip[var],var |"sort -nr|head -n10"}' log


5.linux下ifconfig命令显示结果如下:
eth0      Link encap:Ethernet  HWaddr 00:0C:29:AA:E6:44
          inet addr:192.168.213.128  Bcast:192.168.213.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:feaa:e644/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:39962 errors:0 dropped:0 overruns:0 frame:0
          TX packets:27038 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:35108954 (33.4 MiB)  TX bytes:6573610 (6.2 MiB)
          Base address:0x2000 Memory:c9020000-c9040000

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:1833 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1833 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:4840659 (4.6 MiB)  TX bytes:4840659 (4.6 MiB)
执行如下命令
/sbin/ifconfig eth0|grep 'inet '|sed 's/^.*addr://g'|sed 's/ Bcast.*$//g'
请写出命令的输出结果

    ip地址 犹豫了一下这个要不要写,在命令行里执行一下就行了。

6.多线程/多进程 程序同时访问相同的资源(例如:同时向一个文件里写数据)需要注意些什么?

    至少注意文件锁,读锁与写锁

7.写脚本实现,可以用shell,perl等。把文件B中有的,但是文件A中没有的所有行,保存为文件C,并统计C的行数

    diff B A | grep "<" | sed 's/< //' > C

8.脚本实现把/tmp/目录下所有创建超过7天的文件删除

    find /tmp -mtime +7 -exec rm -rf {} \;

9.把1 2 3 4 5 6按如下格式输出
1
2
3
4
5
6
如何实现

    echo 1 2 3 4 5 6 | sed "s# #\n#g"

10.设计一个shell程序,在2012年12月23日凌晨3点备份并压缩前一天/svn目录的所有内容,存放在/root/bak目录里,且文件名为如下形式svn.2008.05.06.tar.gz,试写脚本。

    at 201212230300
    at> find /svn -mtime +1 -and -mtime -2 -exec cp -r {} /root/bak \;
    at> tar -czf svn.2008.05.06.tar.gz /root/bak
 
     感谢何运涛同学,已经毕业的同学,薪水也不错。现在我们是同行了,这些题目是他帮忙整理的,原始版本都是照片,都是他一个一个字打上去的,尤其是第一题!

本文出自 “林肯” 博客,请务必保留此出处http://president.blog.51cto.com/4990508/854647