linux-shell面试题 之三

由于工作的关系,收集了很多的shell面试题,有些比较有意思,比如我在 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
感谢何运涛同学,已经毕业的同学,薪水也不错。现在我们是同行了,这些题目是他帮忙整理的,原始版本都是照片,都是他一个一个字打上去的,尤其是第一题!

你可能感兴趣的:(开发,正则表达式,shell,面试题,sed)