linux shell 指令碼攻略筆記

yepkeepmoving發表於2016-12-18
 最近對linux shell指令碼攻略這本書過了一遍,對裡面的一些命令和技巧做了些筆記,供以後參考使用
一、環境變數
    1、修改登入提示符顯示格式
    臨時修改:鍵入 export PS1='[\u@\H \w]\$ ',回車,修改環境變數 PS1。注意,命令區分大小寫和空格。
    永久生效:可以在/etc/bashrc、~/.bash_profile等環境變數配置檔案中指定PS1的引數,預設是為[\u@\h \W]\$
    PS1 是系統內建的環境變數名,其包含選項意義為:
    \u :#當前使用者的賬號名稱  
    \w :#完整的工作目錄名稱。家目錄會以 ~代替   
    \W :#短路徑,利用basename取得工作目錄名稱,所以只會列出最後一個目錄,預設。
    \H :#完整的主機名稱。   
    \h :#表示短主機名,預設。僅取主機的第一個名字,如hosts配置主機名為node1,node1.localhost,後者則被省略   
    \d :#代表日期,格式為weekday month date,例如:"Mon Aug 1"   
    \t :#顯示時間為24小時格式,如:HH:MM:SS   
    \T :#顯示時間為12小時格式   
    \A :#顯示時間為24小時格式:HH:MM   
    \v :#BASH的版本資訊   
    \# :#下達的第幾個命令   
    \$ :#提示字元,普通使用者顯示為字元$, root 使用者顯示為字元#
    除此之外,其餘的 [ 、@ 、] 和空格字元按原樣顯示。
    可以透過設定輸出顏色區別提示符,具體設定方式如下:
    aa=`echo -e "\e[31m"`
    bb=`echo -e "\e[0m"`
    export PS1='$aa[\u@\H \w]\$ $bb'

   2、檢視當前環境變數
    程式環境變數:/proc/${PID}/environ
        [root@node1 ~]# cat /proc/5472/environ
    當前環境變數:env
       
二、格式化輸出
    1、printf
    printf    [選項]    [引數]
    選項:
    引數:指定輸出格式和輸出內容
    格式控制主要由"% - 0 m.n l或h 格式字元"幾個部分組成,其中%:表示格式說明的起始符號,不可缺少。-:有-表示左對齊輸出,如省略表示右對齊輸出。0:有0表示指定空位填0,如省略表示指定空位不填。m.n:m指域寬,即對應的輸出項在輸出裝置上所佔的字元數。N指精度。用於說明輸出的實型數的小數位數。為指定n時,隱含的精度為n=6位。l或h:l對整型指long型,對實型指double型。h用於將整型的格式字元修正為short型。
    示例:
    #!/bin/bash
    printf "%-5s %-10s %-4s\n" NO Name Mark
    printf "%-5s %-10s %-4.2f\n" 01 Tom 90.3456
    printf "%-5s %-10s %-4.2f\n" 02 Jack 89.2345
    printf "%-5s %-10s %-4.2f\n" 03 Jeff 98.4323
    ##%-5s含義解釋為:%號表示格式輸出開始,-代表左對齊,5表示輸出字元佔用有5個字元,如不足則右側補充空格(左對齊右側補,右對齊左側補充空格),如果超出5則按實際輸出,s表示輸出內容以字元形式展示。%4.2f含義解釋為:%表示輸出格式開始,4表示輸出4位數,.2表示精確到兩位小數,f表示浮點數顯示。
    格式替代符:
    %b 相對應的引數被視為含有要被處理的轉義序列之字串。
    %c ASCII字元。顯示相對應引數的第一個字元
    %d, %i 十進位制整數
    %e, %E, %f 浮點格式
    %g %e或%f轉換,看哪一個較短,則刪除結尾的零
    %G %E或%f轉換,看哪一個較短,則刪除結尾的零
    %o 不帶正負號的八進位制值
    %s 字串
    %u 不帶正負號的十進位制值
    %x 不帶正負號的十六進位制值,使用a至f表示10至15
    %X 不帶正負號的十六進位制值,使用A至F表示10至15
    %% 字面意義的%

    轉義序列
    \a 警告字元,通常為ASCII的BEL字元
    \b 後退
    \c 抑制(不顯示)輸出結果中任何結尾的換行字元(只在%b格式指示符控制下的引數字串中有效),而且,任何留在引數裡的字元、任何接下來的引數以及任何留在格式字串中的字元,都被忽略
    \f 換頁(formfeed)
    \n 換行
    \r 回車(Carriage return)
    \t 水平製表符
    \v 垂直製表符
    \\ 一個字面上的反斜槓字元
    \ddd 表示1到3位數八進位制值的字元,僅在格式字串中有效
    \0ddd 表示1到3位的八進位制值字元

    2、echo
    echo會將輸入的字串送往標準輸出。輸出的字串間以空白字元隔開, 並在最後加上換行號。
    echo -n :echo預設會加換行符\r,可以透過echo -n去掉末尾的換行符
    echo -e : 開啟反斜槓ESC轉義。若字串中出現以下字元,則特別加以處理,而不會將它當成一般文字輸出:
           \a 發出警告聲;
           \b 刪除前一個字元;
           \c 最後不加上換行符號;
           \f 換行但游標仍舊停留在原來的位置;
           \n 換行且游標移至行首;
           \r 游標移至行首,但不換行;
           \t 插入tab;
           \v 與\f相同;
           \\ 插入\字元;
           \nnn 插入nnn(八進位制)所代表的ASCII字元;
       例如顏色輸出、空格、回車、換行、tab輸出等,其中顏色輸出方式如下:
           [root@node1 shell]# echo -e "\e[1;31m hello \e[0m"   
        hello
       例如:echo -e "\033[44;37;5m ME\033[0m COOL"
       解釋:"\033[44;37;5m ME "設定背景為藍色,前景為白色,閃爍游標,輸出字元“ME”;
           "\033[0m COOL"重新設定螢幕到預設設定,輸出字元 “COOL”。
           "e"是命令echo的一個可選項,它用於啟用特殊字元的解析器。"\033"引導非常規字元序列(即"\033["表示終端跳脫字元開始,"\033"即退出鍵的ASCII碼)。"m"意味著設定屬性然後結束非常規字元序列,這個例子裡真正有效的字元是"44;37;5"和"0"。修改"44;37;5"可以生成不同顏色的組合,數值和編碼的前後順序沒有關係。

       其中字型顏色重置=0,黑色=30,紅色=31,綠色=32,黃色=33,藍色=34,洋紅=35,青色=36,白色=37
       背景色重置=0,黑色=40,紅色=41,綠色=42,黃色=43,藍色=44,洋紅=45,青色=46,白色=47
      可以選擇的編碼如下所示(這些顏色是ANSI標準顏色):
          編碼          顏色/動作
          0            重新設定屬性到預設設定
          1            設定粗體
          2            設定一半亮度(模擬彩色顯示器的顏色)
          4            設定下劃線(模擬彩色顯示器的顏色)
          5            設定閃爍
          7            設定反向圖象
          22           設定一般密度
          24           關閉下劃線
          25           關閉閃爍
          27           關閉反向圖象
          30           設定黑色前景
          31           設定紅色前景
          32           設定綠色前景
          33           設定黃色前景
          34           設定藍色前景
          35           設定紫色前景
          36           設定青色前景
          37           設定白色(灰色)前景
          38           在預設的前景顏色上設定下劃線
          39           在預設的前景顏色上關閉下劃線
          40           設定黑色背景
          41           設定紅色背景
          42           設定綠色背景
          43           設定黃色背景
          44           設定藍色背景
          45           設定紫色背景
          46           設定青色背景
          47           設定白色(灰色)背景
          49           設定預設黑色背景
    其他有趣的程式碼還有:
          \033[2J      清除螢幕
          \033[0q      關閉所有的鍵盤指示燈
          \033[1q      設定"滾動鎖定"指示燈(Scroll Lock)
          \033[2q      設定"數值鎖定"指示燈(Num Lock)
          \033[3q      設定"大寫鎖定"指示燈(Caps Lock)
          \033[15:40H   把關閉移動到第15行,40列
          \007        發蜂鳴生beep

    一些說明:
        前景顏色各數字是對應背景顏色減去10。
        結束非常規字元序列的"m"要緊跟前面的數字,不能有空格。
        命令也可以寫成echo -e "^[[44;37;5m ME \033[0m COOL",其中的"^["是先按Ctrl-V,然後再按鍵產生的。
        輸出帶有顏色的文字,echo命令必須帶有選項"-e"。
    這種方法只能暫時改變echo命令輸出的文字的樣式,logout後就恢復為預設。修改.bashrc檔案,可以修改預設的顯示樣式。
    如:在.bashrc檔案的最後面追加一行:echo -e '\033[47;30m'。
    # 建議:在shell檔案的最前面,將echo命令的輸出樣式定義成變數。
        # define echo terminal style
        # color: 0~6 --> black, red, green, yellow, blue, purple, cyan, grey
        export ECHO_STYLE_00="\033[0m"        # default style(black background, white foreground)
        export ECHO_STYLE_01="\033[41;33;1m"  # red background, yellow foregound bold
        echo -e "${ECHO_STYLE_01}echo command terminal style example${ECHO_STYLE_00}"

三、常用命令

    1、獲取字串長度:
    ${#var}
    [root@node1 ~]# aa=123456
    [root@node1 ~]# echo ${#aa}
    6

    $*  變數輸出格式:"a b c"
    $@  變數輸出格式:"a" "b" "c"
    $#  變數輸出格式:3   (即變數個數)
    $$  變數返回程式號
    $?  變數返回上個命令執行結果是否成功(0成功,非0失敗)
    $!  shell最後執行的後臺pid
    $-  使用set設定的flag一覽
    $0  shell本身檔名

    2、數學運算
    可以利用let (()) [] bc expr進行數學運算
    1)let計算
       [root@node1 ~]# let r=1+2
       [root@node1 ~]# echo $r
       3
    2)(())計算
       [root@node1 ~]# echo $((1+2))
       3
    3)[]計算
       [root@node1 ~]# echo $[1+2]
       3
    4)expr計算
       [root@node1 ~]# expr 1 + 2
       3
    5)bc高階運算
       [root@node1 ~]# echo "1+2" |bc
       3
       設定小數精度
       [root@node1 ~]# echo "scale=2;2/8"|bc
       .25
       設定進位制轉換
       [root@node1 ~]# echo "obase=2;1+1"|bc
       10
       計算平方
       [root@node1 ~]# echo "2^2"|bc    
       4
    3、檔案描述符和重定向
    檔案描述符是與檔案輸入和輸出相關聯的整數,可以利用$?判斷上條命令是否執行成功(0成功,非0失敗)。常見的有以下三類:
    stdin :標準輸入 0
    stdout:標準輸出 1
    stderr:標準錯誤 2
    
    cat <test.log
    xxx
    EOF
    
    自定義檔案描述符建立:exec
    exec  4< test.log ;echo abc >test.log; cat <&4
    exec  5>test.log ;echo abc >&5 ;cat test.log
    exec  6>>test.log ;echo abc >&6 ;cat test.log
    exec 3>&1 4>&2 1>$LOG 2>&1
    4、陣列
    定義陣列:
    array_var=(1 2 3 4 5 6 )
    陣列賦值:
    array_var[0]="test1"
    array_var[1]="test2"
    ...
    array_var[5]="test6"
    陣列取值:
    echo ${array_var[0]}                  ##取出陣列中單個值
    echo ${array_var[*]} 或者 echo ${array_var[@]}      ##取出陣列中所有值
    echo ${#array_var[*]}                 ##取出陣列元素個數
    echo ${!array_var[*]}                 ##列出陣列索引編號
    5、終端資訊獲取
    tput和stty工具處理終端資訊
    tput:
        tput cols        獲取終端列數
        tput lines        獲取終端行數
        tput longname    獲取終端名稱
            tput cup 10 8    將游標定位到10行8列處
        tput setb no       設定終端背景色,no可以設定為0-7
        tput serf no     設定終端前景色(文字顏色),no可以設定為0-7
        tput bold        設定文字加粗
        tput smu1        設定下劃線起點
        tput rmu1        設定下劃線
        tput ed        刪除當前游標位置到行尾的所有內容
        tput sgr0        取消所有tput設定
    stty:
        stty -echo       禁止將輸出顯示在終端,一般用於密碼輸入
        stty echo
    6、指令碼除錯
    可以透過執行sh -x  test.sh做執行過程,也可以在shell指令碼中透過設定 set -x ,set +x 做指令碼區域除錯,其中將!#/bin/bash改為!#/bin/bash -xv 表示進入debug模式
    7、函式和引數
    函式定義:
        function fname()
        {
        statements;
        }
    或者
        fname()
        {
        statements;
        }
    執行函式:
        fname;
        fname var01 var02 ;
    匯出函式:(將函式用於子程式中)
        export -f fname
    8、read讀入
    read -n num var            ##讀取輸入內容的前num個字元,將其儲存到var中
    read -s var            ##靜默輸入,不顯示輸入變數內容
    read -p "引數出入:" var        ##顯示輸入資訊,將輸入儲存到var變數中
    read -d ":" var            ##界定符為:結束輸入行
    9、欄位分隔符
    預設是空白字元(換行符、製表位、空格),可以透過IFS=改變欄位分隔符
    10、迴圈
    while 迴圈語法:(給定條件為真,則執行迴圈)
        while condition
        do
        commands;
        done
    for 迴圈語法:
        for var in list;
        do
        commands;
        done
    或者
        for((i=0;i<10;i++))
        {
           commands;
        }
          until 迴圈語法:(給定條件為真,則跳出迴圈)
        until contition
        do
        commands;
        done
    11、比較與測試
    if語法:
        if condition;
        then
        command;
        fi
    或者
        if condition;
        then
        commands;
        else
        commands;
        fi
     或者
        if condition;
        then
        commands;
        else if condtion;
        then
        commands;
        else
        commands;
        fi
    算數比較:[]或者[[]]
        [ -gt ]      大於
        [ -lt ]    小於
        [ -ge ]    大於等於
        [ -le ]    小於等於
        [ -eq ]    等於
        [ -ne ]    不等於
    字串比較:(最好使用[[]]代替[])
        [ $str1 == $str2 ]     等於
        [ $str1 != $str2 ]    不等於
        [ $str1 > $str2 ]     大於
        [ $str1 < $str2 ]     小於
        [ -z $str1 ]     如果str1是空字串,則返回真
        [ -n $str1 ]     如果str1是非空字串,則返回真

    檔案系統相關測試:
        [ -f $var ]    給定變數包含正常檔案路徑或者檔名,則返回真
        [ -x $var ]    給定變數包含的檔案可執行,則返回真
        [ -d $var ]    給定的變數包含是目錄,則返回真
        [ -e $var ]    給定的變數包含檔案存在,則返回真
        [ -c $var ]    給定的變數包含的是一個字元裝置檔案的路徑,則返回真
        [ -b $var ]    給定的變數包含的是一個塊裝置檔案的路徑,則返回真
        [ -w $var ]    給定的變數包含的檔案可寫,則返回真
        [ -r $var ]    給定的變數包含的檔案可讀,則返回真
        [ -L $var ]    給定的變數好含一個字元連線,則返回真
    
    12、錄製與回訪終端會話
    script和scriptreplay
        script -t 2> timing.log -a output.session    ##將時序寫入timing.log,會話命令寫入output.session,錯誤日誌也重定向到timing.log
        commands;        ##錄製的命令
        exit        ##退出錄製
    
       scriptreplay timing.log output.session  ##按時序回訪錄製

    多會話顯示:
       terminal1: mkfifo scriptfifo
       terminal2: cat scriptfifo
       tarninal1: script -f scriptfifo
                  commands
       此時會話1輸入的命令在會話2就能實時的顯示出來,透過在會話1使用exit退出錄製演示
    13、find命令查詢檔案
    find ./  -name/-type/-size/-iname  -exec command {} \; 其中{}是特殊字串,匹配find找到的檔案,以;表示comman命令的結束。\是轉義符,
因為分號在命令中還有它用途,所以就用一個\來限定表示這是一個分號而不是表示其它意思。
    14、xargs
    多行輸入轉單行輸出:cat aa|xargs
    單行輸入轉多行輸出:cat aa|xargs -n 3  ##空格是列分隔符,可以透過-d指定列分隔符
    刪除檔案:find ./ -name *.txt -exec rm -rf {} \; 可以利用xargs替換,即find ./ -name *.txt |xargs rm -rf
    15、tr替換
    將 標準輸入的字元進行替換、刪除以及壓縮,語法為tr [options] set1 set2
    將大寫字母替換為小寫字母:echo "ABCD EFGH" |tr 'A-Z' 'a-z'
    刪除字元:tr -d 'xx'
    16、sort排序和uniq
    sort -nrk 2 file.txt    ##其中-n表示數字排序,-k 2表示第二列,-r表示逆序排序(降序)
    uniq -u        ##統計沒有重複的行
    uniq -d        ##找出重複資料的行
    17、expect實現互動
    /usr/bin/expect
    spawn    指定需要自動化哪一個命令
    expect    提供需要等待的訊息
    send    傳送訊息,\n換行
    expect eof   結束互動
    18、檔案粘滯位設定
    設定粘滯位後,只有目錄的所有者才能刪除目錄中的檔案,即時有足夠的許可權使用者也不能執行刪除操作(root除外)
    chmod a+t file
    chattr +i file

三、正規表示式
    1、正規表示式特殊符號

    字元    含義
    c    匹配字元c
    .    匹配任意單個字元※※※
    *    匹配前一個字元出現0次或多次※※※
    .*    匹配任意多個字元※※※
    []    匹配集合中的任意單個字元,括號中為一個集合※
    [x-y]    匹配連續的字串範圍※
    ^    匹配字串的開頭※※※
    $    匹配字串的結尾※※※
    [^]    匹配否定,對括號中的集合取反※※※
    \    轉義後面的字元
    \{n,m\}    匹配前一個字元重複n到m次
    \{n,\}    匹配前一個字元重複至少n次
    \{n\}    匹配前一個字元n重複n次
    \(\)    將\(與\)之間的內容儲存在保留空間,最大儲存9個
    \n    透過\1到\9呼叫保留空間的內容


    字元    含義
    []    等同於基本正規表示式的\{n,m\}
    +    匹配前一個字元出現一次或多次
    ?    匹配前一個字元出現0次或一次
    |    匹配邏輯或者,即匹配前或後的字串
    ()    匹配正則集合

    字符集        含義        字符集        含義
    [:alpha:]    字母字元    [:graph:]    非空格字元
    [:alnum:]    字母與數字字元    [:print:]    任何可以顯示的字元
    [:cntrl:]    控制字元    [:space:]    任何產生空白的字元
    [:digit:]    數字字元    [:blank:]    空格與tab鍵字元
    [:xdigit:]    十六進位制數字字元 [:lower:]    小寫字元
    [:punct:]    標點符號    [:upper:]    大寫字元

    2、grep
    grep -E     等同於egrep,使用擴充套件正規表示式
    grep -o        只輸出匹配文字部分
    grep -v        排除過濾
    grep -c        統計匹配字元的行數
    grep -n        顯示匹配行號
    grep -R        遞迴過濾,也可使用-r
    grep -i        忽略大小寫
    grep -e .. -e ..多文字過濾
    grep abc  -A  3 顯示包含abc行的後三行記錄,共4行(至少)
    grep abc  -B  3 顯示包含abc行的前三行記錄,共4行(至少)
    grep abc  -C  3 顯示包含abc行的前、後三行記錄,共7行(至少)
    3、cut
    cut -f1,2 -d"," --complement    ##-f指定列號,-d指定列分隔符,--complement排除擷取的列
    cut -cN-M    ##擷取從N到M個字元,也可以設定-cN-,-c-M
    4、sed
    sed 's/pattern/replace_pattern/g' file    ##在file中查詢pattern字串,並用replace_pattern替換,其中g可以是1g,2g,Ng,表示從N個匹配的開始替換,/可以用其他符號#、;、|等代替,也可用\轉義
    sed '/^$/d' file            ##刪除文字空行
    echo "This is a test shell" |sed 's/\w\+/[&]/g'    ##正規表示式\w\+匹配每一個單詞,[&]用以替換它,其中&表示之前匹配到的任意單詞
    echo "This is a test 10 shell" |sed 's/test \(10\)/\1/g'  ##\(10\)用以匹配,而\1作為第一個匹配替換掉前面匹配的內容,可以透過\3 \2 \1 多次替換
    sed "s#FTP_LCD#${DBFILE_DIR}#g;s#FTP_FILE#${FTP_NAME}#g" ftpdown.conf   ##組合多個表示式替換
    sed "s/$name/jk/"    ##變數引用替換
    sed "s:/\*.*\*/::/g"    ##移除註釋
    tr -s ' '或者sed 's/[ ]\+/ /g'  ##移除多餘空格
    sed 's/[^.]*mobile[^.]*\.//g'    ##移除在同一行中兩個.之間的mobile字串
    5、awk
    語法:awk 'BEGIN{print "start"} pattern {commands} END{print "end"}' file
    示例:awk 'BEGIN{print "start"} {print } END{print "end"}' aa      
    特殊變數:
        NR:記錄行數,在執行過程中對應於當前行號
        NF:欄位數量,在執行過程中對應當前行的欄位數
        $0:包含執行過程中當前行的文字內容
        $1:包含第一個欄位的文字內容
        $2:包含第二個欄位的文字內容
    行過濾:
        awk 'NR<5'      行號小於5的記錄
        awk 'NR==1,NR==4'      行號1和5之間的行
        awk '/linux/'      包含linux的行
        awk    '!/linux/'    不包含linux的行
        awk '/start_pattern/,/end_pattern/' filename    列印匹配字串中間行
    
    6、tac
    逆序排列
    seq 5 |tac
四、其他命令
    1、wget
    從給定的url中下載檔案或者網頁
    語法:wget url
    wget -t 5 utl        ##-t表示重試次數,這裡表示重試5次
    其他引數以及含義如下:
    --limit-rate 20k    ##表示限速20K,可以用k,m表示限速單位
    --quota或-Q 10m        ##表示限制配額,下載內容大小限制
    -c            ##斷點續傳
    -r            ##遞迴
    -l  depth        ##頁面層級深度
    -N            ##允許對檔案使用時間戳
    --mirror        ##下載網頁所有頁面
    --user --password    ##針對http或ftp認證的頁面,指定使用者名稱和密碼
    2、curl
    curl支援http/https/ftp等多種協議的下載
    語法:curl url [option]
    option引數選項如下:
    --silent    ##將下載輸出不顯示
    -o        ##將輸出寫入指定檔案
    --progress    ##表示顯示下載進度
    -C -url        ##斷點續傳
    -H        ##頭部資訊
    --limit-rate    ##限制下載頻寬
    --max-filesize  ##限制檔案大小
    -u username:password    ##指定使用者名稱、密碼
    --user-agent    ##指定代理
    --head或-I    ##只列印頭部資訊,不下載整個檔案
    -d或者--data    ##傳送指定的資料檔案
    
    3、tar
    語法:tar [option] file.tar  file
    option選項如下:
    -c    建立檔案
    -r    向已存在壓縮包新增新檔案
    -t    列出歸檔檔案
    -x    解壓壓縮包
    -C    指定解壓路徑
    -A    拼接兩個壓縮包
    -d    比較壓縮包和檔案差別
    --delete 刪除壓縮包中檔案 --delete --file aa.tar [file list]
    -j/-z    
    --exclude
    4、zip
    zip/unzip
    5、ifconfig
    ifconfig eth0 10.127.1.1
    ifconfig eth0 10.127.1.1 netmask 255.255.255.0
    ifconfig eth0 hw ether 00:1c:bf:87:24:d5
    6、route
    route -n     ##以數字顯示
    route add default gw ip_addr interface_name
    7、watch
    監控命令輸出
    語法格式:watch 'commands'
    -n seconds    指定監控重新整理間隔時間為N秒
    -d        顏色標記差異
    8、ps
    ps -eo         ##其中-o可以指定輸出的列名,具體如下
    引數        描述
    pcpu        CPU佔用率
    pid        程式ID
    ppid        父程式ID
    pmem        記憶體佔用率
    comm        可執行檔名
    cmd        簡單命令
    user        啟動程式使用者
    nice        優先順序
    time        累積的CPU時間
    etime        程式啟動後度過的時間
    tty        關聯的tty裝置
    euid        有效的使用者id
    stat        程式狀態
    9、wall
    向所有連線伺服器的使用者中斷髮送寫入訊息
    cat message |wall
    wall "This a message"

五、指令碼附錄:
    1、統計歷史執行命令最多的前10條
    cat ~/.bash_history |awk '{list[$1]++} END {for(i in list){printf("%s\t%d\n",i,list[i])}}'|sort -nrk 2|head
    2、監控1小時內CPU使用情況
#!/bin/bash
#FileName:      pcpu_usage.sh
#Usage:         Calculate cpu usage in 1hour

SECS=3600
UNIT_TIME=60

STEPS=$(($SECS/$UNIT_TIME))
echo Watching CPU Usage ...;
for((i=0;i<steps;i++))
do
  ps -eo comm,pcpu|tail -n +2 >>/tmp/cpu_usage.$$
  sleep $UNIT_TIME
done

echo
echo CPU eaters;

cat /tmp/cpu_usage.$$|awk '{process[$1]+=2} END{for(i in process){printf("%-20s %s\n",i,process[i])}}'|sort -nrk 2|head
rm -rf /tmp/cpu_usage.$$

    3、shift 利用引數位移接收輸入引數
#!/bin/bash
while [ $# -ne 0 ]
do
case $1 in
   -f)a=first;shift;;
   -s)b=second;shift;;
   -t)c=third;shift;;
   *)echo nothing;exit 0;;
esac
done
echo $a
echo $b
echo $c
4、syslog
*.*  @ip
export PROMPT_COMMAND='{ msg=$(history 1 | { read x y; echo $y; });user=$(whoami); logger $(date "+%Y-%m-%d %H:%M:%S"):$user:"$msg":$(who am i); }'

</steps;i++))

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27067062/viewspace-2130881/,如需轉載,請註明出處,否則將追究法律責任。

相關文章