linux-shell面試題 之三

 標籤:正則表達式 開發 shell 面試題 sed

原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章