Shell

一、編寫shell程序,實現自動刪除50個帳號的功能。帳號名爲stud1至stud50。
     一句話思路:找出規律,循環解決
     for((i=1;i<51;i++));do userdel -r stud$i ;done
     知識點:for循環,固然是用while循環也是能夠的,until也行。
  
二、某系統管理員需天天作必定的重複工做,請按照下列要求,編制一個解決方案:
(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命令打包參數,這樣作會有一個提示,只是去掉了目錄不用理會。

  三、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命令。
  
四、linux crontab;請在3月23號21點18分的時候,重啓服務器
  
    一句話思路:計劃任務+關機
  
    crontab -e
    18 21 23 3 * init 6
  
    知識點:可能會延展提問到最安全的關機命令,「寫緩存」sync 最好兩遍,有人說三遍,其實四遍也行,要不乾脆仍是別關機了!
  
五、你想天天23:00運行xxxx.sh腳本。並自動進行日誌分析。第2天上班的時候看到分析結果 給出你的部屬方案
  
    一句話思路:計劃任務,日誌分析
  
    0 23 * * * sh ****.sh;err=$?;logger -p cron.err $err
  
    知識點:第一個參數必定要寫零,不然在定義的23點裏每分鐘都會執行。計劃任務只有當報錯的時候纔會以郵件形式發送給用戶,因此這裏使用logger命令將消息發送給日誌服務器,這裏只是發送了命令返回值,你能夠隨意發送內容,看你喜歡了。
  
六、要求:運行腳本輸入兩個數獲得以下結果:

  #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中是通配符,因此要加轉義字符。(但願你能給出更好的解決方案!)
  
九、查找文件後綴是log的 三天前的文件刪除
  
    一句話思路:查找就必定是find
  
    find / -name "*.log" -and -mtime +3 -exec rm -rf {} ;
  
    知識點:-mtime  + 表明後面數字以外的,- 就是以內的。
  
十、寫一個腳本將目錄下大於100kb的文件移動到/tmp下

      一句話思路:同上
  
    find ./ -size +100k -exec mv {}  /tmp ;
  
    知識點:-exec  {}  ; 標準寫法,沒有好辦法,背吧。
php


11 、日誌以下統計訪問IP最多的前10個

192.168.0.6 - - [25/Nov/2010:13:55:10 +0800] "GET /cacti/images/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
  
十二、過濾出當前目錄下全部以字母(不區分大小寫)開頭的文件
  
    一句話思路:過濾就是grep
  
    ls | grep -P "^[a-zA-Z]"
  
    ls | grep -P -i "^[a-z]"
  
    知識點:正則表達式,使用-i參數讓grep命令不區分大小寫。
  
1三、文件A.txt內容爲"12:34:68",只輸出A.txt中的"34"
  
    一句話思路:提取內容就是awk
  
    awk  -F ":" '{print $2}' A.txt
  
    知識點:awk 域,-F參數指定分隔符,默認分隔符是空格。
   
1四、用sed命令實現直接將文件B.TXT中的全部123替換成345
  
    一句話思路:沒思路了,人家都說了用sed
  
    sed -i 's/123/456/g' B.TXT
  
    知識點:-i參數讓sed修改文件,默認不修改源文件。題目中提到了全部字樣,因此要使用g參數。
  
1五、用sed修改文件mailbox.txt的20行的zhango爲wang
  
    一句話思路:命題做文sed,沒有瞎想空間
  
    sed -i '20s/zhango/wang/' mailbox.txt
  
    知識點:上題是全局,這題規定了行。若是寫成這樣"/20/",就是正則表達式了。
  
1六、正則表達式,IP地址的匹配,寫一下
  
    一句話思路:遙想當年,web開發程序員面試不出意外的第一道題。
  
    ([0-9]{1,3}.){1,3}([0-9]){1,3}
  
    知識點:正則表達式,寫個簡單的,這個答案不嚴謹,但考慮到只是面試,因此將就將就也能用。
  
1七、寫出命令。統計日誌文件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中的數學計算。
  
1八、求一組數的最大值和最小值

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

  
1九、將當前目錄全部文件擴展名改成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。因此要分着寫。html

相關文章
相關標籤/搜索