常用shell腳本

常有shell腳本

2011年4月7日woyoo3,341 瀏覽數發表評論閱讀評論

轉載:http://hdxiong.iteye.com/blog/949063

1、腳本之間傳遞參數 “1.sh”的腳本,接受參數。


如下,如果有一個參數則賦值個sourceFile這個變量,否則用默認值。

#!/bin/bash
LANG=en_US.UTF-8
#get parameters
sourceFile=”/data/log/abc”
if [ $# == 1 ]
then sourceFile=$1
else echo “$1 required!”
fi
echo $sourceFile

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

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

“2.sh”的腳本,傳遞參數
#!/bin/bashsh 1.sh 參數1 參數2 …
備註:多個參數之間用空格符隔開


2、文件內容行之間的排序

#!/bin/bashsort -t= +4 文件 ”
備註:“=”表示按=號進行切割,“+4”表示按第五個項進行排序


3、判斷目錄是否存在,沒有則新建一個目錄

#!/bin/bash
dayDir=”/home/logs/”
if [ ! -d “$dayDir” ]
then mkdir “$dayDir” fi

4、判斷文件是否存在,有則刪除

#!/bin/bash
if [ -f “$FAIL_FILE” ]
then
rm -rf “$FAIL_FILE”
echo 
date
” FILE IS EXISTS: “$FAIL_FILE
fi

5、找出文件中的相關行

#!/bin/bashcat 文件 |grep -a “關鍵詞” >> result.log
備註:把文件中包含關鍵詞的行輸出到result.log中。

6、文件切分

#!/bin/bashawk -F” ‘{print $1}’ 文件
備註:“”表示分隔符,“print”表示換行輸出(printf不換行),“$1”表示取第一項。“文件”表示要切分的文件

7、文件內容排重

#!/bin/bashawk -F’,’ ‘!a[$1]++’ test.txt
備註:“,”表示按“,”號分隔;“$1”表示按第一項排重;“test.txt”表示要處理的文件。

8、grep多個關鍵字

#!/bin/bashcat $file |grep -a “aop=keyword1\|keyword2″
備註:多個關鍵字用“\|”分隔


9、時間格式化,中間有空格的需要加引號

#!/bin/bash
TODAY=
date -d today '+%Y-%m-%d %H:%M:%S'


10、多個文件合併

#!/bin/bashcat $FILE1 $FILE2 |grep -a “關鍵字” > $MERGE_FILE

11、運行java項目

#!/bin/bashLANG=en_US.UTF-8export LANG=$LANG/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”表示參數值。

12、根據關鍵字統計行數,賦值給變量

#!/bin/bashCOUNT=$(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命令的執行結果與上面一樣。

13、基本算術計算的方法(5種)

a.使用awk計算
#!/bin/bash##示例1:10和12爲兩個參數分別對應$1和$2echo 10 12 |awk ‘{printf(“%d\n”, $1+$2)}’
##示例2:a和b作爲兩個變量傳入a=10b=12echo |awk ‘{printf(“%d\n”, ‘$a’+’$b’)}’
##示例3:COUNT_FAIL除以COUNT_INIT 保留4爲小數,結果賦值給FAIL_INIT,[b]結果四捨五入[/b]。COUNT_FAIL=10COUNT_INIT=20 FAIL_INIT=awk 'BEGIN{printf "%.4f\n",'$COUNT_FAIL'/'$COUNT_INIT'}'echo $FAIL_INIT
備註:示例2和示例3兩種寫法除數和被除數都要加“’”號(單引號),否則會報錯“division by zero attempted”,另外“BEGIN”也很重要哦。
b.使用bc命令
#!/bin/bash##示例1:輸出 1+2 的運算結果echo 1+2 |bc
##示例2:COUNT_FAIL除以COUNT_INIT 保留2爲小數,結果賦值給FAIL_INIT,[b]結果不四捨五入[/b]。FAIL_INIT=echo "scale=2; $COUNT_FAIL/$COUNT_INIT" | bc
c.使用expr命令
#!/bin/bashcount=10count=expr $count + 12echo $count
d.使用let命令
#!/bin/bash##示例1let num1=10*20echo $num1
##示例2let “num2=10*20″echo $num2
e.加雙括號
#!/bin/bash##示例1:雙小括號a=12b=20echo $((a*b))echo $(($a*$b))
##示例2:中括號c=10echo [c*20]echo $[$c*20]
備註:此種寫法括號裏面的變量可以不用加“$”符號,但是括號外面的“$”符號一定要加上。

14、運用tee命令將日誌同時輸出到多個文件

tee用法功能說明:讀取標準輸入的數據,並將其內容輸出成文件。語 法:tee [-ai][–help][–version][文件…]補充說明:tee指令會從標準輸入設備讀取數據,將其內容輸出到標準輸出設備,同時保存成文件。參 數:-a或–append 附加到既有文件的後面,而非覆蓋它.-i或–ignore-interrupts 忽略中斷信號。-help 在線幫助。-version 顯示版本信息。例1:日誌在記入log1.txt和log2.txt的同時也在控制檯輸出Shell代碼  收藏代碼
#!/bin/bashecho “hello jack!” |tee -a log1.txt log2.txt
備註:“-a”追加,否則清空重寫。

15、針對某個域進行分組統計

#!/bin/bashcat $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]”表示每組的數量。

16、查詢控制命令的歷史記錄

#!/bin/bash history |grep “rm”
備註:查詢包含“rm”字符的命令記錄。
17、循環刪除所有文件
#!/bin/bashfor i in ls; do rm $i; done
備註:在文件非常多的情況下,rm * 命令不能刪除所有文件。所以需要遍歷刪除每一個文件。

18、遍歷文件夾並按第二個域對文件內容排序。

#!/bin/bash
#用等號分隔,按第二個域排序
function sortfile(){
echo ‘Processing: ‘$1 sort -t= +1 $1 > $1’_temp’
mv $1’_temp’ $1
}
#遍歷文件夾,調用排序函數
function ergodic(){
for file in 
ls $1
do
if [ -d $1″/”$file ]
then
ergodic $1″/”$file
else
f=$1″/”$file
#調用排序函數
sortfile $f
fi
done
}
#以參數形式運行程序
if [ $# == 1 ];
then
echo “parameter: “$1;
ergodic $1
else
echo “a file directory required!”
fi

19、查看文件夾下所有文件數目和所有文件夾數目

#!/bin/bash #查看當前文件夾下所有文件數目 find . -type f |wc -l #查看當前文件夾下所有文件夾數目 find . -type d |wc -l
備註:“.”表示當前目錄,可以換成其他路徑。

20、shell與java正則區別

String regex = “2010-11-08.+” //或者 regex = “2010-11-08.*”
備註:JAVA中匹配以“2010-11-08″開頭的字符串。
regex = “2010-11-08*”
備註:SHELL中匹配以“2010-11-08”開頭的字符串。 “.*”或“.+”在java中表示任意多個字符串,如果要匹配“.”號,需要加轉義“\”。 “*”在shell表示任意多個字符,加“.”或“+”號都會錯誤。

21、編碼轉換命令

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


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