linux-shell面试题 之二
生活随笔
收集整理的這篇文章主要介紹了
linux-shell面试题 之二
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
?標簽:面試題?shell?正則表達式?開發(fā)?sed
原創(chuàng)作品,允許轉(zhuǎn)載,轉(zhuǎn)載時請務必以超鏈接形式標明文章?原始出處?、作者信息和本聲明。否則將追究法律責任。http://president.blog.51cto.com/4990508/854249 由于工作的關系,收集了很多的shell面試題,有些比較有意思,有些純粹是為折磨人用的題目。有的看完會心一笑,有的看了之后會以為是幾年前開發(fā)的面試題。不知道是會的人多了,還是有意的為難,想起一句話,廟小妖風大,水淺那個啥多。?????? 多說一句,解決的方法有很多種,也許這里給出的答案并不是最優(yōu)的,但應該是比較容易解釋,容易理解的。具體是什么公司的面試題就不說了,畢竟是人家的隱私。 這篇的內(nèi)容相對基礎,主要集中在計劃任務和find命令上面。
?????? crontab 分時日月周 find命令的 exec 和 xargs 這是兩個比較容易遺忘的知識點。
? 1、編寫shell程序,實現(xiàn)自動刪除50個賬號的功能。賬號名為stud1至stud50。
???? 一句話思路:找出規(guī)律,循環(huán)解決
???? for((i=1;i<51;i++));do userdel -r stud$i ;done
???? 知識點:for循環(huán),當然是用while循環(huán)也是可以的,until也行。
??
2、某系統(tǒng)管理員需每天做一定的重復工作,請按照下列要求,編制一個解決方案:
(1)在下午4 :50刪除/abc目錄下的全部子目錄和全部文件;
(2)從早8:00~下午6:00每小時讀取/xyz目錄下x1文件中每行第一個域的全部數(shù)據(jù)加入到/backup目錄下的bak01.txt文件內(nèi);
(3)每逢星期一下午5:50將/data目錄下的所有目錄和文件歸檔并壓縮為文件:backup.tar.gz;
??
??? 一句話思路:主要考驗管理員對于計劃任務的熟悉程度
???? crontab -e
? ?? 50 16 * * * rm -rf /abc/*
? ?? * 8-18/1 * * * awk '{print $1 > "/backup/bak01.txt"}' /xyz/x1
? ?? 50 17 * * 1 tar -czf backup.tar.gz /data
??
??? 知識點:awk的輸出重定向,當然用管道也是可以的。tar命令打包參數(shù),這樣做會有一個提示,只是去掉了目錄不用理會。
? 3、gameser這個服務啟動命令為./gameser服務,請寫一個腳本,當服務宕掉,腳本自動拉起gameser服務。
??
??? 一句話思路:進程管理
??
#!/bin/bash
while true;do
??????? result=`ps aux | grep gameser | wc -l`
??
??????? if [ $result -lt 2 ];then? ./gameser; fi
??
??????? sleep 5
done
??
知識點:還可以使用pgrep命令。
??
4、linux crontab;請在3月23號21點18分的時候,重啟服務器
??
??? 一句話思路:計劃任務+關機
??
??? crontab -e
? ? 18 21 23 3 * init 6
??
??? 知識點:可能會延展提問到最安全的關機命令,“寫緩存”sync 最好兩遍,有人說三遍,其實四遍也行,要不干脆還是別關機了!
??
5、你想每天23:00運行xxxx.sh腳本。并自動進行日志分析。第2天上班的時候看到分析結(jié)果 給出你的部屬方案
??
??? 一句話思路:計劃任務,日志分析
??
??? 0 23 * * * sh ****.sh;err=$?;logger -p cron.err $err
??
??? 知識點:第一個參數(shù)一定要寫零,否則在定義的23點里每分鐘都會執(zhí)行。計劃任務只有當報錯的時候才會以郵件形式發(fā)送給用戶,所以這里使用logger命令將消息發(fā)送給日志服務器,這里只是發(fā)送了命令返回值,你可以隨意發(fā)送內(nèi)容,看你喜歡了。
??
6、要求:運行腳本輸入兩個數(shù)得到如下結(jié)果:
? #sh xxx.sh 2 3
????? **
????? ***
????? *****
??
??? 一句話思路:看到這個第一反應就是循環(huán)唄。
??
#!/bin/bash
line1=$1
line2=$2
let line3=$1+$2
while [ $line1 -gt 0 ];do
??????? echo -n \*
??????? let line1=$line1-1
done
??????? echo
while [ $line2 -gt 0 ];do
??????? echo -n \*
??????? let line2=$line2-1
done
??????? echo
while [ $line3 -gt 0 ];do
??????? echo -n \*
??????? let line3=$line3-1
done
??????? echo
??
??? 知識點:如果你的第一反應是使用循環(huán),那就進入一個死循環(huán)了,因為根本就沒有規(guī)律。我們都知道,循環(huán)是依靠一定規(guī)律的。echo 的 -n參數(shù)。*在shell中是通配符,所以要加轉(zhuǎn)義字符。(希望你能給出更好的解決方案!)
??
9、查找文件后綴是log的 三天前的文件刪除
??
??? 一句話思路:查找就一定是find
??
??? find / -name "*.log" -and -mtime +3 -exec rm -rf {} \;
??
??? 知識點:-mtime? + 代表后面數(shù)字之外的,- 就是之內(nèi)的。
??
10、寫一個腳本將目錄下大于100kb的文件移動到/tmp下
? ??? 一句話思路:同上
??
??? find ./ -size +100k -exec mv {}? /tmp \;
??
??? 知識點:-exec? {}? \; 標準寫法,沒有好辦法,背吧。
??
11 、日志如下統(tǒng)計訪問IP最多的前10個
192.168.0.6 - - [25/Nov/2010:13:55:10 +0800] "GET /cacti/p_w_picpaths/auth_login.gif HTTP/1.1" 200 21265 "http://192.168.0.104/cacti/graph_view.php?action=tree&tree_id=2&leaf_id=8&page=3" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.1)"
192.168.0.6 - - [25/Nov/2010:13:55:14 +0800] "GET /favicon.ico HTTP/1.1" 404 287 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; InfoPath.1)
??
??? 這個題在前一篇中已經(jīng)給出答案,這里就不再贅述。
??? http://7648853.blog.51cto.com/4990508/851407
??
12、過濾出當前目錄下所有以字母(不區(qū)分大小寫)開頭的文件
??
??? 一句話思路:過濾就是grep
??
??? ls | grep -P "^[a-zA-Z]"
??
??? ls | grep -P -i "^[a-z]"
??
??? 知識點:正則表達式,使用-i參數(shù)讓grep命令不區(qū)分大小寫。
??
13、文件A.txt內(nèi)容為"12:34:68",只輸出A.txt中的"34"
??
??? 一句話思路:提取內(nèi)容就是awk
??
??? awk? -F ":" '{print $2}' A.txt
??
??? 知識點:awk 域,-F參數(shù)指定分隔符,默認分隔符是空格。
???
14、用sed命令實現(xiàn)直接將文件B.TXT中的所有123替換成345
??
??? 一句話思路:沒思路了,人家都說了用sed
??
??? sed -i 's/123/456/g' B.TXT
??
??? 知識點:-i參數(shù)讓sed修改文件,默認不修改源文件。題目中提到了所有字樣,所以要使用g參數(shù)。
??
15、用sed修改文件mailbox.txt的20行的zhango為wang
??
??? 一句話思路:命題作文sed,沒有瞎想空間
??
??? sed -i '20s/zhango/wang/' mailbox.txt
??
??? 知識點:上題是全局,這題規(guī)定了行。如果寫成這樣"/20/",就是正則表達式了。
??
16、正則表達式,IP地址的匹配,寫一下
??
??? 一句話思路:遙想當年,web開發(fā)程序員面試不出意外的第一道題。
??
??? ([0-9]{1,3}\.){1,3}([0-9]){1,3}
??
??? 知識點:正則表達式,寫個簡單的,這個答案不嚴謹,但考慮到只是面試,所以將就將就也能用。
??
17、寫出命令。統(tǒng)計日志文件weblog.log中 今天14:00~15:00的記錄條數(shù)(時間格式:2011-01-01—15:30:11)
??
??? 一句話思路:第一反應,這個要用awk,分析統(tǒng)計嘛。可真要用awk麻煩就大了。
??
??? sum14=`grep -c "2011-01-01-14" weblog.log`
??? sum15=`grep -c "2011-01-01-15" weblog.log`
??? echo $[$sum14+$sum15]
??? 知識點:grep命令-c參數(shù),統(tǒng)計匹配的行數(shù)。shell中的數(shù)學計算。
??
18、求一組數(shù)的最大值和最小值
? ??? 一句話思路:運維越來越像開發(fā)了,冒泡法都有了。越來越難混了,一個運維不看手冊,要看算法了。
??
??? 知識點:去看書吧,看算法的。
??
19、將當前目錄所有文件擴展名改為log
??
??? 一句話思路:如果你的第一反應是使用find命令,那么恭喜你,你中了敵人的奸計,不是不能實現(xiàn),是很麻煩。
??
for file in `ls ./ | grep -P "(.*)(\..*)"`;do? echo $file | mv $file `sed -r 's#(.*)(\..*)#\1.log#'`; done
??
for file in `ls ./ | grep -P "(.*)(\..*)"`;do? echo $file | mv $file `echo ${file%.**}`.log; done
??
??? 知識點:第一個方法中使用了sed,第二個方法中使用了字符操作,#從前向后數(shù),%從后向前數(shù)。其實說白了,就是為了拼湊出 mv 參數(shù)1 參數(shù)2。其實很多時候,編寫shell腳本的時候要學會反向推導,逆向思考。
??
?????? 還有一種方法是使用cut命令,但如果遇到文件有兩個擴展名的情況下就會出現(xiàn)問題。redhat as4 安裝完成后,在root目錄下會生成install.log? install.log.syslog這兩個文件,如果使用cut就會出現(xiàn)錯誤。具體原因在這里就不說了。運維嘛,需要的是嚴謹!
??
20、用shell在/usr/local下 建立20個子目錄 xunlei1-xunlei20,再在這個子目錄下分別建255個子目錄dir1-dir255,再在255個子目錄下創(chuàng)建10000個文件xunlei1.html-xunlei10000.html
??
??? 一句話思路:這有啥,{}大括號唄。
??
??? mkdir -p /usr/loca/xunlie{1..20}/dir{1..255}/
??? touch?? /usr/loca/xunlie{1..20}/dir{1..255}/xunlei{1..10000}.html??
???
??? 知識點:如果你就這么寫上去,那你又中計了。為什么呢,因為超過了shell命令參數(shù)的最大限制。shell中參數(shù)的限制是:5452。所以要分著寫。
??
??? 寫到這里,不禁感嘆,面試這件事情越來越難。本來面試就緊張,滿懷期待,不僅要跟HR討價還價,還要與技術主管斗智斗勇,好吧,人是活的,我們?nèi)塘恕?蛇B死的面試題都要處處小心。可話說回來,面試題做不出來,就算你跟諸葛亮對著罵街都能微操勝券也沒用。
? ??? 在這里要特別感謝邰鍇同學,這些shell題是他幫忙匯總整理出來的。
?
本文出自 “林肯” 博客,請務必保留此出處http://president.blog.51cto.com/4990508/854249
轉(zhuǎn)載于:https://blog.51cto.com/1158497363/1088509
總結(jié)
以上是生活随笔為你收集整理的linux-shell面试题 之二的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux:ps命令以及进程状态详解
- 下一篇: linux系统下PHP无法调用oracl