經常使用shell腳本

一、腳本之間傳遞參數 "1.sh"的腳本,接受參數。以下,若是有一個參數則賦值個sourceFile這個變量,不然用默認值。 
  Shell代碼html

  1.    

  2. #!/bin/bash   java

  3. LANG=en_US.UTF-8   mysql

  4. #get parameters   linux

  5. sourceFile="/data/log/abc"   sql

  6. if [ $# == 1 ]   shell

  7.   then sourceFile=$1   apache

  8.   else echo "$1 required!"   數組

  9. fi   緩存

  10. echo $sourceFile   tomcat


備註:這裏$#是傳遞參數的個數,$1 是具體的參數。 

關於if else: 
若是兩條命令寫在同一行則須要用";"號隔開,一行只寫一條命令就不須要寫";"號了。和[命令同樣,要注意命令和各參數之間必須用空格隔開。if命令的參數組成一條子命令,若是該子命令的Exit Status爲0(表示真),則執行then後面的子命令,若是Exit Status非0(表示假),則執行elif、else或者fi後面的子命令。if後面的子命令一般是測試命令,但也能夠是其它命令。Shell腳本沒有{}括號,因此用fi表示if語句塊的結束。 

"2.sh"的腳本,傳遞參數 
  Shell代碼

  1.    

  2. #!/bin/bash   

  3. sh 1.sh 參數1 參數2 ...   


備註:多個參數之間用空格符隔開。 

二、文件內容行之間的排序 
  Shell代碼

  1.    

  2. #!/bin/bash   

  3. sort -t= +4 文件 」  


備註:「=」表示按=號進行切割(注意:只能是單個字符),「+4」表示按第五個項進行排序。 
更多參數: 
-r 表示降序排序 
-n 表示按數字大小排序 
-k 表示根據那個字段排序,4.1,表示第4列第一個字符開始 ,5表示到第5個字段爲結束 
-t 後面跟分隔符,缺省是空格 
例如:sort -r -n -k4.1,5 


三、判斷目錄是否存在,沒有則新建一個目錄 
  Shell代碼

  1.    

  2. #!/bin/bash   

  3. dayDir="/home/logs/"   

  4. if [ ! -d "$dayDir" ]   

  5.   then mkdir "$dayDir" fi   



四、判斷文件是否存在,有則刪除 
  Shell代碼

  1.    

  2. #!/bin/bash   

  3. if [ -f "$FAIL_FILE" ]  

  4.   then   

  5.     rm -rf "$FAIL_FILE"   

  6.     echo `date`" FILE IS EXISTS: "$FAIL_FILE   

  7. fi  



五、找出文件中的相關行 
  Shell代碼

  1.    

  2. #!/bin/bash   

  3. cat 文件 |grep -a "關鍵詞" >> result.log   


備註:把文件中包含關鍵詞的行輸出到result.log中。 

六、文件切分 
  Shell代碼

  1.    

  2. #!/bin/bash   

  3. awk -F'' '{print $1}' 文件   


備註:「」表示分隔符,「print」表示換行輸出(printf不換行),「$1」表示取第一項。「文件」表示要切分的文件 

七、文件內容排重 
  Shell代碼

  1.    

  2. #!/bin/bash   

  3. awk -F',' '!a[$1]++' test.txt   


備註:「,」表示按「,」號分隔;「$1」表示按第一項排重;「test.txt」表示要處理的文件。 

八、grep多個關鍵字 
  Shell代碼

  1.    

  2. #!/bin/bash   

  3. cat $file |grep -a "aop=keyword1\|keyword2"   


備註:多個關鍵字用「\|」分隔。 

九、時間格式化,中間有空格的須要加引號 
  Shell代碼

  1.    

  2. #!/bin/bash   

  3. TODAY=`date -d today '+%Y-%m-%d %H:%M:%S'`   



十、多個文件合併 
  Shell代碼

  1.    

  2. #!/bin/bash   

  3. cat $FILE1 $FILE2 |grep -a "關鍵字" > $MERGE_FILE   



十一、運行java項目 
  Shell代碼

  1.    

  2. #!/bin/bash   

  3. LANG=en_US.UTF-8   

  4. export LANG=$LANG   

  5. /usr/java/latest/bin/java -cp . -Djava.ext.dirs=../lib 包.類(含main方法) -a 參數1 -b 參數2   


備註:「/usr/java/latest/bin/java」表示Java環境,「-cp」表示classpath路徑,「.」表示當前目錄,「-Djava.ext.dirs」表示jar文件所在目錄,「-a」表示參數名稱,「參數1」表示參數值。 

十二、根據關鍵字統計行數,賦值給變量 
  Shell代碼

  1.    

  2. #!/bin/bash   

  3. COUNT=$(cat $FILE |grep -a "關鍵字" |wc -l)   


備註:「$FILE」表示要統計的文件,「關鍵字」要包含的關鍵字,「wc」統計文件(-l行數,-w字數,-c字節數) 
wc命令的功能爲統計指定文件中的字節數、字數、行數, 並將統計結果顯示輸出。 
語法:wc [選項] 文件… 
說明:該命令統計給定文件中的字節數、字數、行數。若是沒有給出文件名,則從標準輸入讀取。wc同時也給出全部指定文件的總統計數。字是由空格字符區分開的最大字符串。 
該命令各選項含義以下: 
-c 統計字節數。 
-l 統計行數。 
-w 統計字數。 
這些選項能夠組合使用。 輸出列的順序和數目不受選項的順序和數目的影響。老是按下述順序顯示而且每項最多一列。 行數、字數、字節數、文件名 若是命令行中沒有文件名,則輸出中不出現文件名。 例如: $wc -lcw file1 file2 4 33 file1 7 52 file2 11 11 85 total 省略任選項-lcw,wc命令的執行結果與上面同樣。 

1三、基本算術計算的方法(5種) 
a.使用awk計算 
  Shell代碼

  1.    

  2. #!/bin/bash   

  3. ##示例1:1012爲兩個參數分別對應$1和$2   

  4. echo 10 12 |awk '{printf("%d\n", $1+$2)}'   

  5.   

  6. ##示例2:a和b做爲兩個變量傳入   

  7. a=10   

  8. b=12   

  9. echo |awk '{printf("%d\n", '$a'+'$b')}'   

  10.   

  11. ##示例3:COUNT_FAIL除以COUNT_INIT 保留4爲小數,結果賦值給FAIL_INIT,[b]結果四捨五入[/b]。   

  12. COUNT_FAIL=10   

  13. COUNT_INIT=20 FAIL_INIT=`awk 'BEGIN{printf "%.4f\n",'$COUNT_FAIL'/'$COUNT_INIT'}'`   

  14. echo $FAIL_INIT   


備註:示例2和示例3兩種寫法除數和被除數都要加「'」號(單引號),不然會報錯「division by zero attempted」,另外「BEGIN」也很重要哦。 

b.使用bc命令 
  Shell代碼

  1.    

  2. #!/bin/bash   

  3. ##示例1:輸出 1+2 的運算結果   

  4. echo 1+2 |bc   

  5.   

  6. ##示例2:COUNT_FAIL除以COUNT_INIT 保留2爲小數,結果賦值給FAIL_INIT,[b]結果不四捨五入[/b]。   

  7. FAIL_INIT=`echo "scale=2; $COUNT_FAIL/$COUNT_INIT" | bc`   



c.使用expr命令 
  Shell代碼

  1.    

  2. #!/bin/bash   

  3. count=10   

  4. count=`expr $count + 12`   

  5. echo $count   



d.使用let命令 
  Shell代碼

  1.    

  2. #!/bin/bash   

  3. ##示例1   

  4. let num1=10*20   

  5. echo $num1   

  6.   

  7. ##示例2   

  8. let "num2=10*20"   

  9. echo $num2   



e.加雙括號 
  Shell代碼

  1.    

  2. #!/bin/bash   

  3. ##示例1:雙小括號   

  4. a=12   

  5. b=20   

  6. echo $((a*b))   

  7. echo $(($a*$b))   

  8.   

  9. ##示例2:中括號   

  10. c=10   

  11. echo $[c*20]   

  12. echo $[$c*20]   


備註:此種寫法括號裏面的變量能夠不用加「$」符號,可是括號外面的「$」符號必定要加上。 

1四、運用tee命令將日誌同時輸出到多個文件 
tee用法功能說明:讀取標準輸入的數據,並將其內容輸出成文件。 
語 法:tee [-ai][--help][--version][文件...] 
補充說明:tee指令會從標準輸入設備讀取數據,將其內容輸出到標準輸出設備,同時保存成文件。 
參 數: 
-a或--append 附加到既有文件的後面,而非覆蓋它. 
-i或--ignore-interrupts 忽略中斷信號。 
-help 在線幫助。 
-version 顯示版本信息。 
例1:日誌在記入log1.txt和log2.txt的同時也在控制檯輸出 
  Shell代碼

  1.    

  2. #!/bin/bash   

  3. echo "hello jack!" |tee -a log1.txt log2.txt   


備註:「-a」追加,不然清空重寫。 

1五、針對某個域進行分組統計 
  Shell代碼

  1.    

  2. #!/bin/bash   

  3. cat $FILE |awk -F"" '{list[$11]++;}END{for (val in list) print val, list[val];}' |tee -a $RESULT_FILE   


備註:「$FILE」要處理的文件,用awk命令按「」進行切分,「$11」表示第11域(1,3,5,...),「var」表示分組名稱,「list[var]」表示每組的數量。 

1六、查詢控制命令的歷史記錄 
  Shell代碼

  1.    

  2. #!/bin/bash history |grep "rm"   


備註:查詢包含「rm」字符的命令記錄。 

1七、循環刪除全部文件 
  Shell代碼

  1.    

  2. #!/bin/bash   

  3. for i in `ls`; do rm $i; done   


備註:在文件很是多的狀況下,rm * 命令不能刪除全部文件。因此須要遍歷刪除每個文件。 

1八、遍歷文件夾並按第二個域對文件內容排序。 
  Shell代碼

  1.    

  2. #!/bin/bash   

  3. #用等號分隔,按第二個域排序   

  4. function sortfile(){   

  5.    echo 'Processing: '$1 sort -t= +1 $1 > $1'_temp'   

  6.    mv $1'_temp' $1   

  7. }   

  8. #遍歷文件夾,調用排序函數   

  9. function ergodic(){   

  10.   for file in `ls $1`   

  11.   do   

  12.     if [ -d $1"/"$file ]   

  13.       then  

  14.         ergodic $1"/"$file   

  15.       else   

  16.         f=$1"/"$file   

  17.         #調用排序函數   

  18.          sortfile $f   

  19.      fi   

  20.   done  

  21. }   

  22. #以參數形式運行程序   

  23. if [ $# == 1 ];   

  24.   then   

  25.     echo "parameter: "$1;   

  26.     ergodic $1   

  27.   else   

  28.     echo "a file directory required!"   

  29. fi   



1九、查看文件夾下全部文件數目和全部文件夾數目 
  Shell代碼

  1. #!/bin/bash   

  2. #查看當前文件夾下全部文件數目   

  3. find . -type f |wc -l   

  4.   

  5. #查看當前文件夾下全部文件夾數目   

  6. find . -type d |wc -l   


備註:「.」表示當前目錄,能夠換成其餘路徑。 

20、shell與java正則區別 
  Java代碼

  1. String regex = "2010-11-08.+"   

  2. //或者 regex = "2010-11-08.*"   


備註:JAVA中匹配以「2010-11-08"開頭的字符串。 
  Shell代碼

  1.    

  2. regex = "2010-11-08*"   


備註:SHELL中匹配以「2010-11-08」開頭的字符串。 
「.*」或「.+」在java中表示任意多個字符串,若是要匹配「.」號,須要加轉義「\」。 「*」在shell表示任意多個字符,加「.」或「+」號都會錯誤。 

2一、編碼轉換命令 
  Shell代碼

  1. iconv -f gb2312 -t utf-8 a.log > b.log  


備註:表示把a.log文件從gb2312編碼轉成utf-8的編碼,並把文件寫入b.log 

2二、批量替換多個文件中的字符串 
  Shell代碼

  1. sed -i "s/<原始串>/<新串>/g" `grep <原始串> -rl <目標文件或目錄>`  


備註: 
-i 表示inplace edit,就地修改文件 
-r 表示搜索子目錄 
-l 表示輸出匹配的文件名 

2三、經常使用MySQL語句 
//查詢mysql變量(timeout) 
show variables like '%timeout' 
//查詢緩存變量 
show status like "Qcache%" 
//查詢進程列表 
show PROCESSLIST 

2四、清空memcache數據 
telnet 10.27.5.71 11211 
flush_all 
quit //退出telnet 

2五、監控Tomcat並啓動 
  Shell代碼

  1. #!/bin/sh  

  2.   

  3. export _JAVA_SR_SIGNUM=12  

  4. export JAVA_HOME=/usr/java/jdk1.6.0_11  

  5. export CATALINA_BASE=/home/co_newest_family/tomcat  

  6. export CATALINA_HOME=/usr/local/apache-tomcat-6.0.18  

  7. export LD_LIBRARY_PATH=:/usr/local/lib/:/usr/local/apr/lib/:/usr/local/apr/lib/  

  8. export CATALINA_OPTS="-server -Xms1024m -Xmx2048m -XX:PermSize=128m -XX:MaxPermSize=128m -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9158 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dfile.encoding=UTF8 -Dmeganotes.home=/home/co_newest_family"  

  9. export PATH=$JAVA_HOME/bin:$PATH:$HOME/bin  

  10.   

  11. date=`date "+%H:%M:%S"`  

  12. message="$date|check_tomcat(81_co_newest_family)_shutdown_and_restart_it."  

  13. request_url="http://10.27.5.81:9091/index.jsp"  

  14.   

  15. if ! wget -t1 -T2 $request_url &> /dev/null;then  

  16.    #pid=`ps aux | grep "\-Dcms4.home\=\/home\/co_newest_family\/"| awk '{print $2}'`          

  17.    #kill -9 $pid  

  18.    ps x|grep 'tomcat'|grep -v 'grep'|grep -v 'sh'|awk '{print $1}'|xargs kill -9  

  19.    $CATALINA_HOME/bin/startup.sh  

  20.    wget -t1 -T2 http://10.27.5.112:8880/send.jsp?msg=$message &> /dev/null;  

  21.    echo "$date check tomcat shutdown and restart it." >> logs/check.log  

  22. else  

  23.    echo "$date check tomcat ok." >> logs/check.log  

  24. fi  

  25.   

  26. rm -f index.jsp*  

  27. rm -f send.jsp?msg=*  


備註:定時監控tomcat,發現掛掉,馬上重啓!併發送短信和郵件報告~ 
-t1 表示只請求一次 
-T2 表示2秒超時 

2六、linux查找文件的一些方法 
1) 按文件名查找 
#在/opt目錄及其子目錄下查找包含文件名是以zhjedu開頭的文件 
find /opt -name "zhjedu*"   

2) 按時間查找 
#在/opt目錄及其子目錄下查找最近1個小時修改的文件 
find /opt -mtime -1 
#在/opt目錄及其子目錄下查找1個小時之前修改的文件 
find /opt -mtime +1 

3) 按類型查找 
#在/opt目錄及其子目錄下查找目錄及其子目錄 
find /opt -type d 
#在/opt目錄及其子目錄下查找全部的普通文件 
find /opt -type f 

4) 按大小查找 
#在/opt目錄及其子目錄下查找文件大於10M的文件 
find /opt -size +10000k 

2七、curl命令的用法 
參見1:http://blog.sina.com.cn/s/blog_62b832910100tyfi.html 
參見2:http://javag.iteye.com/blog/499113 

2八、split切割大文件 
  Shell代碼

  1. split -l 10000 log1_6.log.2012-03-21 tt.txt  


備註:將log1_6.log.2012-03-21文件切割成10000行一個的以tt.txt開頭的N多個文件 
-l 表示按行切割 
tt.txt 表示切割後的零碎文件的前綴 

2九、循環讀取行 
讀取文件每行並輸出 
方法一: 
  Shell代碼

  1. #!/bin/sh  

  2. while read line  

  3. do  

  4.       echo $line      

  5. done < filename  


方法二: 
  Shell代碼

  1. #!/bin/sh  

  2. cat filename | while read line  

  3. do  

  4.     echo $line  

  5. done  



30、刪除數量比較多的文件 
  Shell代碼

  1. ls | xargs -n 20 rm -rf  


ls固然是輸出全部的文件名(用空格分割) 
xargs就是將ls的輸出,每20個爲一組(以空格爲分隔符),做爲rm -rf的參數 
也就是說將全部文件名20個爲一組,由rm -rf刪除,這樣就不會超過命令行的長度了 

3一、for循環總結 
a. for((i=1;i<=10;i++));do echo $(expr $i \* 4);done 
b. 在shell中經常使用的是 for i in $(seq 10) 
c. for i in `ls` 
d. for i in ${arr[@]}   
e. for i in $* ; do 
f. for File in /proc/sys/net/ipv4/conf/*/accept_redirects; do 
g. for i in f1 f2 f3 ;do 
h. for i in *.txt 
i. for i in $(ls *.txt) 
  for in語句與` `和$( )合用,利用` `或$( )的將多行合爲一行的缺陷,實際是合爲一個字符串數組 
  for num in $(seq 1 100) 
j. LIST="rootfs usr data data2" 
  for d in $LIST; do 
  用for in語句自動對字符串按空格遍歷的特性,對多個目錄遍歷 
k. for i in {1..10} 
l. for i in stringchar {1..10} 
m. awk 'BEGIN{for(i=1; i<=10; i++) print i}' 

注意:AWK中的for循環寫法和C語言同樣的 
參考:http://hi.baidu.com/plp_cm/blog/item/d828d1881b05e2faf11f3607.html 

3二、格式轉換 
dos2unix, unix2dos 用來實現 DOS <=> UNIX text file 轉換 
  Shell代碼

  1. unix2dos target.$date.txt  

  2. dos2unix target.$date.txt  



3三、根據起止日期打印期間的日期 
  Shell代碼

  1. #!/bin/sh  

  2. #riqizizeng  

  3. datebeg=$1  

  4. dateend=$2  

  5. #read datebeg  

  6. #read dateend  

  7. beg_s=`date -d "$datebeg" +%s`  

  8. end_s=`date -d "$dateend" +%s`  

  9. while [ "$beg_s" -le "$end_s" ]  

  10. do  

  11. day=`date -d @$beg_s +"%Y-%m-%d"`;//本次循環的日期  

  12. beg_s=$((beg_s+86400))  

  13. done  



3四、用awk來對比兩個文件 
要求:輸出a.txt中包含b.txt的行 
命令: 
  Shell代碼

  1. awk 'NR==FNR{a[substr($2,3)]=$0;next}{if($0 in a)print a[$0]}' a.txt b.txt > c.txt  


備註:awk參數用法:http://bbs.chinaunix.net/thread-691456-1-1.htmlhttp://bbs.chinaunix.net/thread-1797847-1-1.html 
substr($2,3):表示截取a.txt第二列從第三個字符開始的全部字符。 
if($0 in a):若是b.txt的一行跟a.txt第二列截取字符的相等。 

a.txt(數據源1) 
---------------- 
12 x=abc 
14 x=ccc 
15 x=acd 

b.txt(數據源2) 
---------------- 
abc 
ccc 
efg 

c.txt(結果) 
---------------- 
12 x=abc 
14 x=ccc 

3五、在root用戶下查看端口被哪一個用戶佔用 
  Shell代碼

  1. lsof -i:8091  



3六、查看一個關鍵字的先後N行 
  Shell代碼

  1. cat tomcat/debuglog/debug.log.2012-07-05-21  |grep -B 5 -A 25 java.net.SocketTimeoutException  



3七、根據修改時間斷定文件數目(適用於大數目文件夾哦) 
  Shell代碼

  1. ll |awk '{print $6$7$8}' |grep Aug212012 |wc -l   


備註:$6表示月份,$7表示日期(最近幾天只顯示時間),$8表示年份。 
如上命令表示:2012-08-21日產生的文件數目

相關文章
相關標籤/搜索