由於工作的關係,收集了很多的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# #
#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

感謝何運濤同學,已經畢業的同學,薪水也不錯。現在我們是同行了,這些題目是他幫忙整理的,原始版本都是照片,都是他一個一個字打上去的,尤其是第一題!