Shell編程 2010-05-25 11:04:45 閱讀644 評論0 字號:大中小
導讀:bkeep 第一篇:基礎篇 1,awk基本語法 2,比較操作符 3,復合表達式 4,next命令: 5,awk中的數字操作符: 6,awk中的賦值操作符 7,BEGIN 和 END 8,內置變量 9,awk使用shell變量 10,awk中的三種流控制語句 10.1 if語句 10.2 while語句: 10.3 for語句: 11. $0: 12,shell里的特殊變量 第二篇:準高級篇 1,內置函數 2, 輸入輸出的內部函數 3,借用C語言的格式化輸出指令, 4,printf “%。。。”中的。。。有以下格式 5,gawk中的特殊字符: 6, 改變字段分隔符 7, 元字符 8, 調用gawk程序 9, 數組 10, 用戶自定義函數 正文: awk ‘script’ files script 由下面的結構組成 /pattern/{actions} 語法:expression {actions;} expression 可以使用以下操作符構成 < 小于 > 大于 <= 小于等于 >= 大于等于 == 等于 != 不等于 value ~ /pattern/ 若value匹配pattern則為真 value !~ /pattern/ 若value不匹配pattern則為真 說明:$2 ~ /^\$[1-9][0-9]* 將匹配第二列以$開頭,然后大于1的二位數。(注意,這里是1而不是10) 語法:(compound expression) (expr1)&& (expr2) ------- 與 (expr1)|| (expr2) ------- 或 說明一下:符合表達式必須用括號括起來 當使用&&時,expr1和expr2必須同時為零(零代表真!呵呵~),復合表達式才為真; 當使用 || 時,expr1和expr2 只要有一個為真,復合表達式則為真! 告訴awk跳過剩下的所有模式和表達式,并讀取輸入的下一行,同時從第一個模式或表達式開始處理該行! + 加 - 減 * 乘 / 除 % 求余 ^ 求冪 += x+=1 就是x=x+1 -= x-=1 就是x=x-1 *= x*=1 就是x=x*1 /= x/=1 就是x=x/1 %= x%=2 就是x=x%2 ^= x^=2 就是x=x^2 awk的語法:/pattern/ {action} pattern:模式 這里pattern有兩個特殊模式BEGIN和END 下面是BEGIN END的語法: awk ‘ BEGIN { actions } / pattern / { actions } / pattern / { actions } END { actions } ‘ files BEGIN和END都是可選的 ·當指定BEGIN模式時,awk在讀取任何輸入前執(zhí)行動作 actions ·當指定END模式時,awk在其退出前執(zhí)行動作actions 這里要特別注意:比如awk讀入aa.txt。那么BEGIN只在讀入aa時執(zhí)行一次,然后按行處理的時候不再執(zhí)行BEGIN指定的action?。ㄒ部梢赃@么理解:BEGIN只對文件生效,而不是按行生效?。。?;理解了BEGIN,END還會糊涂嗎?呵呵! gawk語言中有幾個十分有用的內置變量,現在列于下面: NR 已經讀取過的記錄數。 FNR 從當前文件中讀出的記錄數。 FILENAME 輸入文件的名字。 FS 字段分隔符(缺省為空格)。 RS 記錄分隔符(缺省為換行)。 OFMT 數字的輸出格式(缺省為% g)。 OFS 輸出字段分隔符。 ORS 輸出記錄分隔符。 NF 當前記錄中的字段數。 如果你只處理一個文件,則NR 和FNR 的值是一樣的。但如果是多個文件, NR是對所有的文件來說的,而FNR 則只是針對當前文件而言。 # awk 'BEGIN {FS=":"} {print $1 |"sort"}' /etc/passwd adm apache avahi 此程序會將所有用戶的登錄名稱,依照字母的順序顯示出來。 經過前面的學習,我們知道shell變量的引用由$xxx 實現,而awk中的變量直接使用xxx來引用。所以我們就要思考如何讓awk使用shell變量 語法: awk ‘script’ awkvar1=value awkvar2=value ...... files 說明: awk: 命令; ‘script’:awk將要執(zhí)行的腳本; awkvarN:awk的變量;value:shell中的變量值; files:將要處理的文件名 if語句 while語句 for語句 if (expression1) {action1} else if (expression2) {action2} else { action3} 執(zhí)行過程: 1)計算expression1的值 2)若expression1為真,執(zhí)行action1并推出if語句 3)若expression1為假,計算expression2 4)若expression2為真,執(zhí)行action2并退出if語句 5)若expression2為假,執(zhí)行action3并退出if while (expression) { actions } 若expression為真,則執(zhí)行actions [root@master bkeep]# awk 'BEGIN { x=0;while(x<3) {x+=1;print x;}}' //先給x+1再輸出 for (initialize_counter; test_counter;increment_counter) { action } 解釋一下,呵呵 for (初始化計數器變量;測試計數器是否到頂了;增加計數器的值) { 要執(zhí)行的動作! } 【常用】 循環(huán)迭代處理記錄中的域并輸出他們 [root@master bkeep]# cat for2.sh #!/bin/bash awk '{ for (x=1;x<=NF;x+=1) { printf "%s ",$x "zbb"; } printf "\n"; }' fruit_prices.txt awk使用變量0原原本本地存儲它所讀入的整個輸入行。這樣可以保持和原來文本格式相同的輸出 # sh /usr/local/bkeep/shell.sh 001 002 I'm $0 is:/usr/local/bkeep/shell.sh //正在被執(zhí)行腳本的名字;`basename $0` I'm $1 is:001 //$1接收到的參數 I'm $2 is:002 //$2接收到的參數 I'm $# is:2 //總共接收到的參數個數 I'm $* is:001 002 //把接收到的參數全部打印出來 I'm $@ is:001 002 //同上 I'm $? is:0 //上一個腳本的退出狀態(tài)“ I'm $$ is:24137 //當前執(zhí)行腳本的進程ID I'm $! is: //前一個后臺進程的id length(string) 求出string 有幾個字符。 match ( string,regexp ) 在字符串string 中尋找符合regexp 的最長、最靠左邊的子字 符串。返回值是regexp 在string 的開始位置,即index值。match 函數將會設置系統(tǒng)變量 RSTART 等于index的值,系統(tǒng)變量RLENGTH 等于符合的字符個數。如果不符合,則會 設置R S TA RT 為0、RLENGTH 為- 1。 sprintf ( format,expression1,. . . ) 和printf 類似,但是sprintf 并不顯示,而是返回字 sub ( regexp,replacement,target ) 在字符串target 中尋找符合regexp 的最長、最靠左的地方,以字串replacement 代替最左邊的regexp。 ·gsub(regexp,replacement,target)與前面的sub類似。在字符串target中尋找符合regexp的所有地方,以字符串replacement代替所有的regexp。例如: substr(string,start,length)返回字符串string的子字符串,這個子字符串的長度為 length,從第start個位置開始。 tolower(string) 將字符串string的大寫字母改為小寫字母。 toupper(string) 將字符串s t r i n g的小寫字母改為大寫字母。 close(filename) 將輸入或輸出的文件filename 關閉。 system(command) 此函數允許用戶執(zhí)行操作系統(tǒng)的指令,執(zhí)行完畢后將回到gawk程 可以讓gawk的輸出形式更為多樣。這時,應該用printf而不是print。例如: # gawk '$1 != "Tim" {printf "%5s likes this language\n",$2}' testfile 10 likes this language 90 likes this language 110 likes this language %5是定義$2列的輸出占5個字符的位置 \n 是換行符 printf是C語言的格式化輸出 d 顯示十進制的整數。 i 顯示十進制的整數。 e 將浮點數以科學記數法的形式顯示。 f 將數字以浮點的形式顯示。 g 將數字以科學記數法的形式或浮點的形式顯示。數字的絕對值如果大于等于0.0001則 o 顯示無符號的八進制整數。 s 顯示一個字符串。 x 顯示無符號的十六進制整數。1 0至1 5以a至f表示。 X 顯示無符號的十六進制整數。1 0至1 5以A至F表示。 % 它并不是真正的格式控制字符,% %將顯示%。 你也可以使用一些換碼控制符格式化整行的輸出。之所以叫做換碼控制符,是因為gawk對這些符號有特殊的解釋。下面列出常用的換碼控制符: a 警告或響鈴字符 b 后退一格 f 換頁 n 換行 r 回車 t Ta b v 垂直的t a b 驗證一下\a,運行后“當”了一聲,呵呵,有意思! # gawk '{printf "%5s works for %10s and earns % # awk -F "," '{print $1,$2,$3}' aa ^ 表示字段的開始。 $ 表示字段的結束。 . 表示和任何單字符m匹配。 | 表示“或”。 * 表示字符的零到多次重復。 + 表示字符的一次到多次重復。 {a,b} 表示字符a次到b次之間的重復。 //沒有成功! 表示字符零次和一次的重復。 [] 表示字符的范圍。 [^] 表示不在[ ]中的字符。 # gawk –f script filename # gawk –f script -F";" filename # gawk -f script filename1 filename2 filename3 ... gawk語言支持數組結構。數組不必事先初始化。聲明一個數組的方法如下: arrayname[num]=value請看下面的例子: # cat reverse.sh #!/bin/bash {line[NR] = $0 } # remember each line END {var=NR # output lines in reverse order while (var > 0){ print line[var] var-- } } 下面詳細解釋一下自定義的function函數 # cat function.sh #!/bin/bash {print "sum=",SquareSum($1,$2)} //這行是awk最終執(zhí)行的動作(調用我們自定義的函數) //這里把欄位1和欄位2的值分別賦予x,y變量 function SquareSum(x,y){ //function是關鍵字,SquareSum是自定義函數名, //x,y是自定義函數的參數列表 sum=x*y+y*y //函數真正的功能:先相乘再相加,最后返回sum值! return sum } # cat testfile 1 10 11 12 1.1111 9 90 91 92 9.99999 11 110 111 112 111.1111 Tim zhengbin bkeep tom # cat function.sh #!/bin/bash {print "sum=",SquareSum($1,$2)} function SquareSum(x,y){ sum=x*y+y*y return sum } # awk -f function.sh testfile sum= 110 sum= 8910 sum= 13310 sum= 0第一篇:基礎篇
1,awk基本語法
2,比較操作符
3,復合表達式
4,next命令:
5,awk中的數字操作符:
6,awk中的賦值操作符
7,BEGIN 和 END
8,內置變量
改變內置變量的方法?
9,awk使用shell變量
10,awk中的三種流控制語句
10.1 if語句
10.2 while語句:
10.3 for語句:
11. $0:
12,shell里的特殊變量
第二篇:準高級篇
1,內置函數
2, 輸入輸出的內部函數
3,借用C語言的格式化輸出指令,
4,printf “%。。。”中的。。。有以下格式
5,gawk中的特殊字符:
6, 改變字段分隔符
7, 元字符
8, 調用gawk程序
9, 數組
10, 用戶自定義函數