linux-shell面試題 之二

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

原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。http://president.blog.51cto.com/4990508/854249
       由於工作的關係,收集了很多的shell面試題,有些比較有意思,有些純粹是爲折磨人用的題目。有的看完會心一笑,有的看了之後會以爲是幾年前開發的面試題。不知道是會的人多了,還是有意的爲難,想起一句話,廟小妖風大,水淺那個啥多。 
      多說一句,解決的方法有很多種,也許這裏給出的答案並不是最優的,但應該是比較容易解釋,容易理解的。具體是什麼公司的面試題就不說了,畢竟是人家的隱私。
       這篇的內容相對基礎,主要集中在計劃任務和find命令上面。
       crontab 分時日月周 find命令的 exec 和 xargs 這是兩個比較容易遺忘的知識點。
 
1、編寫shell程序,實現自動刪除50個賬號的功能。賬號名爲stud1至stud50。
     一句話思路:找出規律,循環解決
     for((i=1;i<51;i++));do userdel -r stud$i ;done
     知識點:for循環,當然是用while循環也是可以的,until也行。
  
2、某系統管理員需每天做一定的重複工作,請按照下列要求,編制一個解決方案:
(1)在下午4 :50刪除/abc目錄下的全部子目錄和全部文件;
(2)從早8:00~下午6:00每小時讀取/xyz目錄下x1文件中每行第一個域的全部數據加入到/backup目錄下的bak01.txt文件內;
(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命令打包參數,這樣做會有一個提示,只是去掉了目錄不用理會。

  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天上班的時候看到分析結果 給出你的部屬方案
  
    一句話思路:計劃任務,日誌分析
  
    0 23 * * * sh ****.sh;err=$?;logger -p cron.err $err
  
    知識點:第一個參數一定要寫零,否則在定義的23點裏每分鐘都會執行。計劃任務只有當報錯的時候纔會以郵件形式發送給用戶,所以這裏使用logger命令將消息發送給日誌服務器,這裏只是發送了命令返回值,你可以隨意發送內容,看你喜歡了。
  
6、要求:運行腳本輸入兩個數得到如下結果:

  #sh xxx.sh 2 3
      **
      ***
      *****
  
    一句話思路:看到這個第一反應就是循環唄。
  
#!/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
  
    知識點:如果你的第一反應是使用循環,那就進入一個死循環了,因爲根本就沒有規律。我們都知道,循環是依靠一定規律的。echo 的 -n參數。*在shell中是通配符,所以要加轉義字符。(希望你能給出更好的解決方案!)
  
9、查找文件後綴是log的 三天前的文件刪除
  
    一句話思路:查找就一定是find
  
    find / -name "*.log" -and -mtime +3 -exec rm -rf {} \;
  
    知識點:-mtime  + 代表後面數字之外的,- 就是之內的。
  
10、寫一個腳本將目錄下大於100kb的文件移動到/tmp下

      一句話思路:同上
  
    find ./ -size +100k -exec mv {}  /tmp \;
  
    知識點:-exec  {}  \; 標準寫法,沒有好辦法,背吧。
  
11 、日誌如下統計訪問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)
  
    這個題在前一篇中已經給出答案,這裏就不再贅述。

    http://7648853.blog.51cto.com/4990508/851407
  
12、過濾出當前目錄下所有以字母(不區分大小寫)開頭的文件
  
    一句話思路:過濾就是grep
  
    ls | grep -P "^[a-zA-Z]"
  
    ls | grep -P -i "^[a-z]"
  
    知識點:正則表達式,使用-i參數讓grep命令不區分大小寫。
  
13、文件A.txt內容爲"12:34:68",只輸出A.txt中的"34"
  
    一句話思路:提取內容就是awk
  
    awk  -F ":" '{print $2}' A.txt
  
    知識點:awk 域,-F參數指定分隔符,默認分隔符是空格。
   
14、用sed命令實現直接將文件B.TXT中的所有123替換成345
  
    一句話思路:沒思路了,人家都說了用sed
  
    sed -i 's/123/456/g' B.TXT
  
    知識點:-i參數讓sed修改文件,默認不修改源文件。題目中提到了所有字樣,所以要使用g參數。
  
15、用sed修改文件mailbox.txt的20行的zhango爲wang
  
    一句話思路:命題作文sed,沒有瞎想空間
  
    sed -i '20s/zhango/wang/' mailbox.txt
  
    知識點:上題是全局,這題規定了行。如果寫成這樣"/20/",就是正則表達式了。
  
16、正則表達式,IP地址的匹配,寫一下
  
    一句話思路:遙想當年,web開發程序員面試不出意外的第一道題。
  
    ([0-9]{1,3}\.){1,3}([0-9]){1,3}
  
    知識點:正則表達式,寫個簡單的,這個答案不嚴謹,但考慮到只是面試,所以將就將就也能用。
  
17、寫出命令。統計日誌文件weblog.log中 今天14:00~15:00的記錄條數(時間格式:2011-01-01—15:30:11)
  
    一句話思路:第一反應,這個要用awk,分析統計嘛。可真要用awk麻煩就大了。
  
    sum14=`grep -c "2011-01-01-14" weblog.log`
    sum15=`grep -c "2011-01-01-15" weblog.log`
    echo $[$sum14+$sum15]

    知識點:grep命令-c參數,統計匹配的行數。shell中的數學計算。
  
18、求一組數的最大值和最小值

      一句話思路:運維越來越像開發了,冒泡法都有了。越來越難混了,一個運維不看手冊,要看算法了。
  
    知識點:去看書吧,看算法的。

  
19、將當前目錄所有文件擴展名改爲log
  
    一句話思路:如果你的第一反應是使用find命令,那麼恭喜你,你中了敵人的奸計,不是不能實現,是很麻煩。
  
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,第二個方法中使用了字符操作,#從前向後數,%從後向前數。其實說白了,就是爲了拼湊出 mv 參數1 參數2。其實很多時候,編寫shell腳本的時候要學會反向推導,逆向思考。
  
       還有一種方法是使用cut命令,但如果遇到文件有兩個擴展名的情況下就會出現問題。redhat as4 安裝完成後,在root目錄下會生成install.log  install.log.syslog這兩個文件,如果使用cut就會出現錯誤。具體原因在這裏就不說了。運維嘛,需要的是嚴謹!
  
20、用shell在/usr/local下 建立20個子目錄 xunlei1-xunlei20,再在這個子目錄下分別建255個子目錄dir1-dir255,再在255個子目錄下創建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命令參數的最大限制。shell中參數的限制是:5452。所以要分着寫。
  
    寫到這裏,不禁感嘆,面試這件事情越來越難。本來面試就緊張,滿懷期待,不僅要跟HR討價還價,還要與技術主管鬥智鬥勇,好吧,人是活的,我們忍了。可連死的面試題都要處處小心。可話說回來,面試題做不出來,就算你跟諸葛亮對着罵街都能微操勝券也沒用。

      在這裏要特別感謝邰鍇同學,這些shell題是他幫忙彙總整理出來的。

 

本文出自 “林肯” 博客,請務必保留此出處http://president.blog.51cto.com/4990508/854249

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