寫於2014年冬
簡述
- Shell是系統的用戶界面,提供了用戶與內核進行交互操作的一種接口。它接收用戶輸入的命令並把它送入內核去執行。
- 實際上Shell是一個命令解釋器,它解釋由用戶輸入的命令並且把它們送到內核。不僅如此,Shell有自己的編程語言用於對命令的編輯,它允許用戶編寫由shell命令組成的程序。Shell編程語言具有普通編程語言的很多特點,比如它也有循環結構和分支控制結構等,用這種編程語言編寫的Shell程序與其他應用程序具有同樣的效果。
- 同Linux本身一樣,Shell也有多種不同的版本。主要有下列版本的Shell
- Bourne Shell:Bourne shell 是UNIX 最初使用的shell,並且在每種UNIX 上都可以使用。Bourne
shell 在shell 編程方面相當優秀,但在處理與用戶的交互方面做得不如其他幾種shell。 - BASH:它是Bourne shell 的擴展,簡稱bash 。與Bourne shell 完全向後兼容,並且在Bourne shell
的基礎上增加增強了很多特性,它還包含了很多C shell 和Kornshell 中的優點,有靈活和強大的編程接口同時又有很友好的用戶界面。 - C Shell: C shell 是一種比Bourne shell 更適於編程的shell, 它的語法與C 語言很相似。Linux爲喜歡使用C shell 的人提供了Tcsh。 Tcsh 是C shell 的一個擴展版本。Tcsh包括命令行編輯可編程單詞補全、拼寫校正歷史命令替換、作業控制和類似C語言的語法。它不僅和Bash shell是提示符兼容而且還提供比Bashshell 更多的提示符參數。
- Korn shell 集合了C shell 和Bourne shell 的優點並且和Bourne shell 完全兼容Linux 系統提供了pdksh (ksh 的擴展),它支持任務控制,可以在命令行上掛起、後臺執行、喚醒或終止程序
- Z Shell:The last shell you’ll ever need! Z是最後一個字母,也就是終極Shell。它集成了bash、ksh的重要特性,同時又增加了自己獨有的特性。
- Bourne Shell:Bourne shell 是UNIX 最初使用的shell,並且在每種UNIX 上都可以使用。Bourne
變量與表達式
- $# : 保存程序命令行參數的數目
- $? : 保存前一個命令的返回碼
- $0 : 保存程序名
∗:以(" 1 $2…”)的形式保存所有輸入的命令行參數@:以(" 1”“$2”…)的形式保存所有輸入的命令行參數- -r file : 當file是一個可讀文件時,返回True
- -w file : 當file是一個可寫文件時,返回True
- -x file : 當file是一個可執行文件時,返回True
- -e file : 當file存在時,返回True
- -o file : 當file文件的所有者是當前用戶時,返回True
- -z file : 當file長度爲0時,返回True
- -f file : 當file是一個普通文件時,返回True
- -d file : 當file是一個目錄時,返回True
- Exp1 || exp2 : 當exp1和exp2的值至少一個爲True時,返回True
- Exp1 && exp2 : 當exp1和exp2的值同爲True時,返回True
- ! exp : 當exp的值爲False時,返回True
正則表達式
- 操作符 用途
- .(句號) 匹配任意單個字符。
- ^(脫字號) 匹配出現在行首或字符串開始位置的空字符串。
- $(美元符號) 匹配出現在行末的空字符串。
- A 匹配大寫字母 A。
- a 匹配小寫字母 a。
- \d 匹配任意一位數字。
- \D 匹配任意單個非數字字符。
- \w 匹配任意單個字母數字字符,同義詞是 [:alnum:]。
- [A-E] 匹配任意大寫的 A、B、C、D 或 E。
- [^A-E] 匹配除 A、B、C、D 和 E 之外的任意字符。
- X? 匹配出現零次或一次的大寫字母 X。
- X* 匹配零個或任意個大寫 X。
- X+ 匹配一個或多個字母 X。
- X{n} 精確匹配 n 個字母 X。
- X{n,m} 匹配最少 n 個並且不超過 m 個字母 X。如果省略 m,表達式將嘗試匹配最少 n 個 X。
- (abc|def)+ 匹配一連串的(最少一個) abc 或 def;abc 和 def 將匹配。
find 和 xargs
- find是在系統中查找具有某一特徵的文件 (例如文件權限、文件屬主、文件長度、文件類型等等 )
- 選項
- -name 按照文件名查找文件。
- -perm 按照文件權限來查找文件。
- -prune 使用這一選項可以使 find命令不在當前指定的目錄中查找,如果同時使用了 -depth選項,那麼prune選項將被find命令忽略。
- -user 按照文件屬主來查找文件。
- -group 按照文件所屬的組來查找文件。
- -mtime -n +n 按照文件的更改時間來查找文件, - n表示文件更改時間距現在 n天以內, + n表示文件更改時間距現在 n天以前。
- -newer file1 ! file2 查找更改時間比文件 file1 新但比文件 file2舊的文件。
- -depth 在查找文件時,首先查找當前目錄中的文件,然後再在其子目錄中查找。
- xargs
- 在使用 find命令的-exec選項處理匹配到的文件時,find命令將所有匹配到的文件一起傳遞給exec執行。但有些系統對能夠傳遞給exec的命令長度有限制,這樣在find命令運行幾分鐘之後,就會出現溢出錯誤。錯誤信息通常是“參數列太長”或“參數列溢出”。這就是xargs命令的用處所在,特別是與find命令一起使用。
- 選項
- -0 當sdtin含有特殊字元時候,將其當成一般字符,想/’空格等
- -p 操作具有可交互性,每次執行comand都交互式提示用戶選擇
- -I xargs的每項名稱,一般是一行一行賦值給{},可以用{}代替。-I 必須指定替換字符 -i 是否指定替換字符-可選
- -d delim 分隔符,argument的分隔符是空格
- -r 無參數時,停止 xargs
- 示例
find / -type f -print | xargs grep "device“
find ./ -name "*.log" | xargs -i cp {} ./a/
grep
- grep(全局正則表達式版本)允許對文本文件進行模式查找。如果找到匹配模式, grep打印包含模式的所有行。
grep支持基本正則表達式,也支持其擴展集。 grep [選項] 基本正則表達式 [文件] - 常用的 grep選項有:
- -c 只輸出匹配行的計數。
- -i 不區分大小寫(只適用於單字符)。
- -h 查詢多文件時不顯示文件名。
- -l 查詢多文件時只輸出包含匹配字符的文件名。
- -n 顯示匹配行及行號。
- -s 不顯示不存在或無匹配文本的錯誤信息。
- -v 顯示不包含匹配文本的所有行。
- -w 完整匹配
- 示例
grep 'Time' load_ml.log
grep -c 'Time' load_ml.log
grep -v 'Time' load_ml.log
grep '2014-10-[1-8]' load_ml.log
grep '^[^2014]' load_ml.log
grep 'sql\{2,\}' load_ml.log
grep '^$' load_ml.log
ls -l | grep '^d‘
ps -ef | grep lock
sed
- sed是一個非交互性文本流編輯器。
- sed [ 選項] sed命令 輸入文件。
- 選項
- n 不打印; sed不寫編輯行到標準輸出,缺省爲打印所有行
- c 下一命令是編輯命令。使用多項編輯時加入此選項
- f 如果正在調用 sed腳本文件,使用此選項
- i 編輯當前文件
- 使用 sed在文件中定位文本的方式
- x x爲一行號,如 1
- x , y 表示行號範圍從 x到y,如 2, 5表示從第 2行到第 5行
- / pattern / 查詢包含模式的行。例如 / d i s k /或/[a-z]/
- / pattern / pattern / 查詢包含兩個模式的行。例如 / d i s k / d i s k s /
- pattern / , x 在給定行號上查詢包含模式的行。如 / r i b b o n / , 3
- x , / pattern / 通過行號和模式查詢匹配行。 3 . / v d u /
- x , y ! 查詢不包含指定行號 x和y的行。 1 , 2 !
- sed常用編輯命令
- p 打印匹配行
- d 刪除定位行
- s 使用替換模式替換相應模式
- 示例
sed -n '1'p load_ml.log
sed -n '/Time/'p load_ml.log
sed -i 's/424.58s/124.53s/g' load_ml.log
awk
- 如果要格式化報文或從一個大的文本文件中抽取數據包,那麼awk可以完成這些任務
- 操作符
- = += *= / = %= ^ = 賦值操作符
- ? 條件表達操作符
- || && ! 並、與、非
- ~! ~ 匹配操作符,包括匹配和不匹配
- < <= == != >> 關係操作符
- ++- - 前綴和後綴
- 內置變量
- ARGC 命令行參數個數
- ARGV 命令行參數排列
- ENVIRON 支持隊列中系統環境變量的使用
- FILENAME a w k瀏覽的文件名
- FNR 瀏覽文件的記錄數
- FS 設置輸入域分隔符,等價於命令行 - F選項
- NF 瀏覽記錄的域個數
- NR 已讀的記錄數
- ORS 輸出記錄分隔符
- RS 控制記錄分隔符
- 內置字符串函數
- gsub(r,s) 在整個$0中用s替代
- rgsub(r,s,t) 在整個t中用s替代r
- index(s,t) 返回s中字符串t的第一位置
- length(s) 返回s長度
- match(s,r) 測試s是否包含匹配r的字符串
- split(s,a,fs) 在fs上將s分成序列
- asprint(fmt,exp) 返回經fmt格式化後的
- expsub(r,s) 用$0中最左邊最長的子串代替s
- substr(s,p) 返回字符串s中從p開始的後綴部分
- substr(s,p,n) 返回字符串s中從p開始長度爲n的後綴部分
示例
列出目錄下的文件及總大小
ls -l | awk ' /^[^d]/ {print $9"\t"$5} {tot+=$5} END {print tot}'
模糊匹配
awk -F"|" '{if($1~/s_gn_/)s+=$5} END {print s}' load_analyze_2014-12-07.log
內置變量
awk -F"/" '{print NF, NR, $0} END {print FILENAME}' url.txt
數字計算
awk -F"|" '{$5=$5/1024/1024;print $1"\t"$5}' load_analyze_2014-12-07.log
Substr
[hadoop@centos6 log]$ str="1234567"
[hadoop@centos6 log]$ echo $str | awk '{print substr($str, 1,5)}‘殺掉進程
ps -ef | grep dispatch_day.sh | awk '{print $2}' | xargs kill -9
其他命令
- sort
- 對文本進行排序
- 常用選項
- -t 域分隔符
- -k 域編號
- -n 按數字排序
- -r 倒序
- 示例
sort -t"|" -k 5 -n -r load_analyze_2014-12-07.log
- uniq
- 用來從一個文本文件中去除或禁止重複行。一般 u n i q假定文件已分類,並且結果正確。
- 常用選項
- -u 只顯示不重複行
- -d 只顯示有重複數據行,每種重複行只顯示其中一行
- -c 打印每一重複行出現次數。
- -f n爲數字,前 n個域被忽略。
- 示例
awk -F"|" '{print $1"|"$5}' load_analyze_2014-12-07.log > a.log
uniq -c a.log
- join
- 用來將來自兩個分類文本文件的行連在一起。
- 常用選項
- -o n.m n 爲文件號, m爲域號。 1 . 3 表示只顯示文件 1 第三域,每個 n, m必須用逗號分隔,如1 . 3, 2 . 1 。
- -j n m n爲文件號, m爲域號。使用其他域做連接域。
- -t 域分隔符。用來設置非空格或 t a b鍵的域分隔符
- 示例
join -j1 1 -j2 1 -t"|" a.log b.log
- cut
- 從標準輸入或文本文件中剪切列或域
- 選項
- -c list 指定剪切字符數。 -c 1, 5-7 剪切第 1 個字符,然後是第 5到第7個字符。
- -f field 指定剪切域數。 -f1,10-12 剪切第1域,第 1 0域到第 1 2域。
- -d 指定與空格和 tab鍵不同的域分隔符
- 示例
- echo load_analyze_2014-12-07.log | cut -d “_” -f 1 | cut -c1-3
- split
- 將大文件分割成小文件
- 選項
- -output_file-size 行數,默認1000
- 示例
- split -4000 a.log
- curl
- 一個功能強大的網絡工具,它能夠通過http、ftp等方式下載文件,也能夠上傳文件。
- 常用選項
- -d/–data HTTP POST方式傳送數據
- -x/–proxy 指定代理服務器地址和端口,端口默認爲1080
- -O:按照服務器上的文件名,自動存在本地
- -T/–upload-file 上傳文件
- -u/–user 設置服務器的用戶和密碼
- 示例
- curl -d “to=136&message=hello test” http://msg:9090/msg
基礎編程
- 條件測試
- 表達式 [ condition ]
- 文件狀態
- -d 目錄
- -s 文件長度大於 0、非空
- -f 正規文件
- -w 可寫
- -L 符號連接
- -u 文件有 suid位設置
- -r 可讀
- -x 可執行
- 邏輯操作符
- -a 邏輯與
- -o 邏輯或
- ! 邏輯否
- 字符串比較
- == 兩個字符串相等。
- != 兩個字符串不等。
- -z 空串。
- -n 非空串。
- 數字比較
- -eq 數值相等。
- -ne 數值不相等。
- -gt 第一個數大於第二個數。
- -lt 第一個數小於第二個數。
- -le 第一個數小於等於第二個數。
- -ge 第一個數大於等於第二個數
- 控制流
- If then else
- case
- for
- until
- While
- Break and continue
Shell函數
- 函數必須放在腳本主體前面
- 函數通過return 或者echo返回值
- 函數文件必須是完整路徑
- 示例
mv_log () {
file=$1
file_name=`echo $file | awk -F"," '{print $1}'`
size=`echo $file | awk -F"," '{print $2}'`
before_size=`cat $tmp_file | grep -w $file_name | awk -F"," '{print $2}'`
if [ "$before_size" == "$size" ]
then
mv $file_name $dest_dir/${file_name} -f &
else
echo $file_name","$size >> $before_file
fi
}
與其他配合
- 多進程
- 調用的函數或者命令後加 &
- wait 等待後臺進程結束
- FTP
open 10.95.3.133
user $user $password
bin
cd pub #必須先cd,然後獲取
get zlib-devel-1.2.3-29.el6.x86_64.rpm
quit
EOF```
#數據庫
/opt/gcluster/server/bin/gbase -h$db_host -u$db_user -p$db_passwd -vvv -e "use $db_name; call p_g_dispatch_day('$data_time');"
參考資料
- Shell腳本學習指南 機械工業出版社
- Linux命令行與shell腳本編程大全(第2版)人民郵電出版社
- AWK Language Programming http://www.math.utah.edu/docs/info/gawk_1.html
- Sed - An Introduction and Tutorial http://www.grymoire.com/Unix/Sed.html
- GNU Grep 2.21 http://www.gnu.org/software/grep/manual/grep.html
- 使用Shell腳本對Linux系統和進程資源進行監控 http://www.csdn.net/article/2012-06-26/2806898
- 寫出健壯的Bash腳本 http://www.csdn.net/article/2012-03-19/313229
- Linux Shell 編程實戰技巧 http://blog.jobbole.com/48717/
- 37條常用Linux Shell命令組合 http://blog.jobbole.com/48173/
- Shell論壇 http://bbs.chinaunix.net/forum-24-1.html