一、腳本之間傳遞參數 "1.sh"的腳本,接受參數。以下,若是有一個參數則賦值個sourceFile這個變量,不然用默認值。
Shell代碼html
#!/bin/bash java
LANG=en_US.UTF-8 mysql
#get parameters linux
sourceFile="/data/log/abc" sql
if [ $# == 1 ] shell
then sourceFile=$1 apache
else echo "$1 required!" 數組
fi 緩存
echo $sourceFile tomcat
備註:這裏$#是傳遞參數的個數,$1 是具體的參數。
關於if else:
若是兩條命令寫在同一行則須要用";"號隔開,一行只寫一條命令就不須要寫";"號了。和[命令同樣,要注意命令和各參數之間必須用空格隔開。if命令的參數組成一條子命令,若是該子命令的Exit Status爲0(表示真),則執行then後面的子命令,若是Exit Status非0(表示假),則執行elif、else或者fi後面的子命令。if後面的子命令一般是測試命令,但也能夠是其它命令。Shell腳本沒有{}括號,因此用fi表示if語句塊的結束。
"2.sh"的腳本,傳遞參數
Shell代碼
#!/bin/bash
sh 1.sh 參數1 參數2 ...
備註:多個參數之間用空格符隔開。
二、文件內容行之間的排序
Shell代碼
#!/bin/bash
sort -t= +4 文件 」
備註:「=」表示按=號進行切割(注意:只能是單個字符),「+4」表示按第五個項進行排序。
更多參數:
-r 表示降序排序
-n 表示按數字大小排序
-k 表示根據那個字段排序,4.1,表示第4列第一個字符開始 ,5表示到第5個字段爲結束
-t 後面跟分隔符,缺省是空格
例如:sort -r -n -k4.1,5
三、判斷目錄是否存在,沒有則新建一個目錄
Shell代碼
#!/bin/bash
dayDir="/home/logs/"
if [ ! -d "$dayDir" ]
then mkdir "$dayDir" fi
四、判斷文件是否存在,有則刪除
Shell代碼
#!/bin/bash
if [ -f "$FAIL_FILE" ]
then
rm -rf "$FAIL_FILE"
echo `date`" FILE IS EXISTS: "$FAIL_FILE
fi
五、找出文件中的相關行
Shell代碼
#!/bin/bash
cat 文件 |grep -a "關鍵詞" >> result.log
備註:把文件中包含關鍵詞的行輸出到result.log中。
六、文件切分
Shell代碼
#!/bin/bash
awk -F'' '{print $1}' 文件
備註:「」表示分隔符,「print」表示換行輸出(printf不換行),「$1」表示取第一項。「文件」表示要切分的文件
七、文件內容排重
Shell代碼
#!/bin/bash
awk -F',' '!a[$1]++' test.txt
備註:「,」表示按「,」號分隔;「$1」表示按第一項排重;「test.txt」表示要處理的文件。
八、grep多個關鍵字
Shell代碼
#!/bin/bash
cat $file |grep -a "aop=keyword1\|keyword2"
備註:多個關鍵字用「\|」分隔。
九、時間格式化,中間有空格的須要加引號
Shell代碼
#!/bin/bash
TODAY=`date -d today '+%Y-%m-%d %H:%M:%S'`
十、多個文件合併
Shell代碼
#!/bin/bash
cat $FILE1 $FILE2 |grep -a "關鍵字" > $MERGE_FILE
十一、運行java項目
Shell代碼
#!/bin/bash
LANG=en_US.UTF-8
export 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」表示參數值。
十二、根據關鍵字統計行數,賦值給變量
Shell代碼
#!/bin/bash
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代碼
#!/bin/bash
##示例1:10和12爲兩個參數分別對應$1和$2
echo 10 12 |awk '{printf("%d\n", $1+$2)}'
##示例2:a和b做爲兩個變量傳入
a=10
b=12
echo |awk '{printf("%d\n", '$a'+'$b')}'
##示例3:COUNT_FAIL除以COUNT_INIT 保留4爲小數,結果賦值給FAIL_INIT,[b]結果四捨五入[/b]。
COUNT_FAIL=10
COUNT_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命令
Shell代碼
#!/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命令
Shell代碼
#!/bin/bash
count=10
count=`expr $count + 12`
echo $count
d.使用let命令
Shell代碼
#!/bin/bash
##示例1
let num1=10*20
echo $num1
##示例2
let "num2=10*20"
echo $num2
e.加雙括號
Shell代碼
#!/bin/bash
##示例1:雙小括號
a=12
b=20
echo $((a*b))
echo $(($a*$b))
##示例2:中括號
c=10
echo $[c*20]
echo $[$c*20]
備註:此種寫法括號裏面的變量能夠不用加「$」符號,可是括號外面的「$」符號必定要加上。
1四、運用tee命令將日誌同時輸出到多個文件
tee用法功能說明:讀取標準輸入的數據,並將其內容輸出成文件。
語 法:tee [-ai][--help][--version][文件...]
補充說明:tee指令會從標準輸入設備讀取數據,將其內容輸出到標準輸出設備,同時保存成文件。
參 數:
-a或--append 附加到既有文件的後面,而非覆蓋它.
-i或--ignore-interrupts 忽略中斷信號。
-help 在線幫助。
-version 顯示版本信息。
例1:日誌在記入log1.txt和log2.txt的同時也在控制檯輸出
Shell代碼
#!/bin/bash
echo "hello jack!" |tee -a log1.txt log2.txt
備註:「-a」追加,不然清空重寫。
1五、針對某個域進行分組統計
Shell代碼
#!/bin/bash
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代碼
#!/bin/bash history |grep "rm"
備註:查詢包含「rm」字符的命令記錄。
1七、循環刪除全部文件
Shell代碼
#!/bin/bash
for i in `ls`; do rm $i; done
備註:在文件很是多的狀況下,rm * 命令不能刪除全部文件。因此須要遍歷刪除每個文件。
1八、遍歷文件夾並按第二個域對文件內容排序。
Shell代碼
#!/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
1九、查看文件夾下全部文件數目和全部文件夾數目
Shell代碼
#!/bin/bash
#查看當前文件夾下全部文件數目
find . -type f |wc -l
#查看當前文件夾下全部文件夾數目
find . -type d |wc -l
備註:「.」表示當前目錄,能夠換成其餘路徑。
20、shell與java正則區別
Java代碼
String regex = "2010-11-08.+"
//或者 regex = "2010-11-08.*"
備註:JAVA中匹配以「2010-11-08"開頭的字符串。
Shell代碼
regex = "2010-11-08*"
備註:SHELL中匹配以「2010-11-08」開頭的字符串。
「.*」或「.+」在java中表示任意多個字符串,若是要匹配「.」號,須要加轉義「\」。 「*」在shell表示任意多個字符,加「.」或「+」號都會錯誤。
2一、編碼轉換命令
Shell代碼
iconv -f gb2312 -t utf-8 a.log > b.log
備註:表示把a.log文件從gb2312編碼轉成utf-8的編碼,並把文件寫入b.log
2二、批量替換多個文件中的字符串
Shell代碼
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代碼
#!/bin/sh
export _JAVA_SR_SIGNUM=12
export JAVA_HOME=/usr/java/jdk1.6.0_11
export CATALINA_BASE=/home/co_newest_family/tomcat
export CATALINA_HOME=/usr/local/apache-tomcat-6.0.18
export LD_LIBRARY_PATH=:/usr/local/lib/:/usr/local/apr/lib/:/usr/local/apr/lib/
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"
export PATH=$JAVA_HOME/bin:$PATH:$HOME/bin
date=`date "+%H:%M:%S"`
message="$date|check_tomcat(81_co_newest_family)_shutdown_and_restart_it."
request_url="http://10.27.5.81:9091/index.jsp"
if ! wget -t1 -T2 $request_url &> /dev/null;then
#pid=`ps aux | grep "\-Dcms4.home\=\/home\/co_newest_family\/"| awk '{print $2}'`
#kill -9 $pid
ps x|grep 'tomcat'|grep -v 'grep'|grep -v 'sh'|awk '{print $1}'|xargs kill -9
$CATALINA_HOME/bin/startup.sh
wget -t1 -T2 http://10.27.5.112:8880/send.jsp?msg=$message &> /dev/null;
echo "$date check tomcat shutdown and restart it." >> logs/check.log
else
echo "$date check tomcat ok." >> logs/check.log
fi
rm -f index.jsp*
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代碼
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代碼
#!/bin/sh
while read line
do
echo $line
done < filename
方法二:
Shell代碼
#!/bin/sh
cat filename | while read line
do
echo $line
done
30、刪除數量比較多的文件
Shell代碼
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代碼
unix2dos target.$date.txt
dos2unix target.$date.txt
3三、根據起止日期打印期間的日期
Shell代碼
#!/bin/sh
#riqizizeng
datebeg=$1
dateend=$2
#read datebeg
#read dateend
beg_s=`date -d "$datebeg" +%s`
end_s=`date -d "$dateend" +%s`
while [ "$beg_s" -le "$end_s" ]
do
day=`date -d @$beg_s +"%Y-%m-%d"`;//本次循環的日期
beg_s=$((beg_s+86400))
done
3四、用awk來對比兩個文件
要求:輸出a.txt中包含b.txt的行
命令:
Shell代碼
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代碼
lsof -i:8091
3六、查看一個關鍵字的先後N行
Shell代碼
cat tomcat/debuglog/debug.log.2012-07-05-21 |grep -B 5 -A 25 java.net.SocketTimeoutException
3七、根據修改時間斷定文件數目(適用於大數目文件夾哦)
Shell代碼
ll |awk '{print $6$7$8}' |grep Aug212012 |wc -l
備註:$6表示月份,$7表示日期(最近幾天只顯示時間),$8表示年份。
如上命令表示:2012-08-21日產生的文件數目