天天看點

常用的shell腳本

1、腳本之間傳遞參數 "1.sh"的腳本,接受參數。如下,如果有一個參數則指派個sourceFile這個變量,否則用預設值。

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

關于if else:

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

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

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

2、檔案内容行之間的排序

備注:“=”表示按=号進行切割(注意:隻能是單個字元),“+4”表示按第五個項進行排序。

更多參數:

-r 表示降序排序

-n 表示按數字大小排序

-k 表示根據那個字段排序,4.1,表示第4列第一個字元開始 ,5表示到第5個字段為結束

-t 後面跟分隔符,預設是空格

例如:sort -r -n -k4.1,5

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

4、判斷檔案是否存在,有則删除

5、找出檔案中的相關行

備注:把檔案中包含關鍵詞的行輸出到result.log中。

6、檔案切分

備注:“”表示分隔符,“print”表示換行輸出(printf不換行),“$1”表示取第一項。“檔案”表示要切分的檔案

7、檔案内容排重

備注:“,”表示按“,”号分隔;“$1”表示按第一項排重;“test.txt”表示要處理的檔案。

8、grep多個關鍵字

備注:多個關鍵字用“\|”分隔。

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

10、多個檔案合并

11、運作java項目

備注:“/usr/java/latest/bin/java”表示Java環境,“-cp”表示classpath路徑,“.”表示目前目錄,“-Djava.ext.dirs”表示jar檔案所在目錄,“-a”表示參數名稱,“參數1”表示參數值。

12、根據關鍵字統計行數,指派給變量

備注:“$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.[b]使用awk計算[/b]

備注:示例2和示例3兩種寫法除數和被除數都要加“'”号(單引号),否則會報錯“division by zero attempted”,另外“BEGIN”也很重要哦。

b.[b]使用bc指令[/b]

c.[b]使用expr指令[/b]

d.[b]使用let指令[/b]

e.[b]加雙括号[/b]

備注:此種寫法括号裡面的變量可以不用加“$”符号,但是括号外面的“$”符号一定要加上。

14、運用tee指令将日志同時輸出到多個檔案

tee用法功能說明:讀取标準輸入的資料,并将其内容輸出成檔案。

語 法:tee [-ai][--help][--version][檔案...]

補充說明:tee指令會從标準輸入裝置讀取資料,将其内容輸出到标準輸出裝置,同時儲存成檔案。

參 數:

-a或--append 附加到既有檔案的後面,而非覆寫它.

-i或--ignore-interrupts 忽略中斷信号。

-help 線上幫助。

-version 顯示版本資訊。

例1:日志在記入log1.txt和log2.txt的同時也在控制台輸出

備注:“-a”追加,否則清空重寫。

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

備注:“$FILE”要處理的檔案,用awk指令按“”進行切分,“$11”表示第11域(1,3,5,...),“var”表示分組名稱,“list[var]”表示每組的數量。

16、查詢控制指令的曆史記錄

備注:查詢包含“rm”字元的指令記錄。

17、循環删除所有檔案

備注:在檔案非常多的情況下,rm * 指令不能删除所有檔案。是以需要周遊删除每一個檔案。

18、周遊檔案夾并按第二個域對檔案内容排序。

19、檢視檔案夾下所有檔案數目和所有檔案夾數目

備注:“.”表示目前目錄,可以換成其他路徑。

20、shell與java正則差別

備注:JAVA中比對以“2010-11-08"開頭的字元串。

備注:SHELL中比對以“2010-11-08”開頭的字元串。

“.*”或“.+”在java中表示任意多個字元串,如果要比對“.”号,需要加轉義“\”。 “*”在shell表示任意多個字元,加“.”或“+”号都會錯誤。

21、編碼轉換指令

備注:表示把a.log檔案從gb2312編碼轉成utf-8的編碼,并把檔案寫入b.log

22、批量替換多個檔案中的字元串

備注:

-i 表示inplace edit,就地修改檔案

-r 表示搜尋子目錄

-l 表示輸出比對的檔案名

23、常用MySQL語句

//查詢mysql變量(timeout)

show variables like '%timeout'

//查詢緩存變量

show status like "Qcache%"

//查詢程序清單

show PROCESSLIST

24、清空memcache資料

telnet 10.27.5.71 11211

flush_all

quit //退出telnet

25、監控Tomcat并啟動

備注:定時監控tomcat,發現挂掉,立刻重新開機!并發送短信和郵件報告~

-t1 表示隻請求一次

-T2 表示2秒逾時

26、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

27、curl指令的用法

參見1:[url]http://blog.sina.com.cn/s/blog_62b832910100tyfi.html[/url]

參見2:[url]http://javag.iteye.com/blog/499113[/url]

28、split切割大檔案

備注:将log1_6.log.2012-03-21檔案切割成10000行一個的以tt.txt開頭的N多個檔案

-l 表示按行切割

tt.txt 表示切割後的零碎檔案的字首

29、循環讀取行

讀取檔案每行并輸出

方法一:

方法二:

30、删除數量比較多的檔案

ls當然是輸出所有的檔案名(用空格分割)

xargs就是将ls的輸出,每20個為一組(以空格為分隔符),作為rm -rf的參數

也就是說将所有檔案名20個為一組,由rm -rf删除,這樣就不會超過指令行的長度了

31、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語言一樣的

參考:[url]http://hi.baidu.com/plp_cm/blog/item/d828d1881b05e2faf11f3607.html[/url]

32、格式轉換

dos2unix, unix2dos 用來實作 DOS <=> UNIX text file 轉換

33、根據起止日期列印期間的日期

34、用awk來對比兩個檔案

要求:輸出a.txt中包含b.txt的行

指令:

備注:awk參數用法:[url]http://bbs.chinaunix.net/thread-691456-1-1.html[/url][url]http://bbs.chinaunix.net/thread-1797847-1-1.html[/url]

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

35、在root使用者下檢視端口被哪個使用者占用

lsof -i:8091
           

36、檢視一個關鍵字的前後N行

37、根據修改時間判定檔案數目(适用于大數目檔案夾哦)

備注:$6表示月份,$7表示日期(最近幾天隻顯示時間),$8表示年份。

如上指令表示:2012-08-21日産生的檔案數目

38、檢視軟體安裝的位置指令如下:

dpkg -L xxx (xxx為軟體名)

比如檢視gedit安裝的位置:

dpkg -L gedit

39、去除UTF-8 BOM SHELL腳本

查找UTF-8 BOM檔案:

grep -rl $’\xEF\xBB\xBF’ .

查找UTF-8 BOM檔案并更改成UTF-8 無BOM檔案:

find . -type f -exec sed ’1s/^\xEF\xBB\xBF//’ -i.bak {} \; -exec rm {}.bak \;

查找/path目錄下的UTF-8 BOM檔案并修改成UTF-8無BOM檔案

grep -r -I -l $'^\xEF\xBB\xBF' /path | xargs sed -i 's/^\xEF\xBB\xBF//;q'

繼續閱讀