
awk是一種解釋執(zhí)行的編程語言,專門用來處理文本數(shù)據(jù)的。?
Awk內(nèi)部工作原理;AWK執(zhí)行的流程非常簡單:讀( Read )、執(zhí) 行( Execute )與重復(fù)( Repeat );下面是流程圖:?
(相關(guān)資料圖)
Awk工作流程圖?
讀( Read ):AWK 從輸入流(文件、管道或者標(biāo)準(zhǔn)輸入)中讀入一行然后將其存入內(nèi)存中。?
執(zhí)行(Execute):對于每一行輸入,所有的?
重復(fù)(Repeate):一直重復(fù)上述兩個(gè)過程直到文件結(jié)束。?
Awk程序結(jié)構(gòu)主要包括三塊:BEGIN(開始塊)、主體塊、END(結(jié)束塊);?
開始塊(BEGIN BLOCK):?
語法:?
BEGIN{awk-commands}?
開始塊就是awk程序啟動(dòng)時(shí)執(zhí)行的代碼部分(在處理輸入流之前執(zhí)行),并且在整個(gè)過程中只執(zhí)行一次;一般情況下,我們在開始塊中初始化一些變量。BEGIN是awk的關(guān)鍵字,因此必須要大寫?!咀ⅲ洪_始塊部分是可選,即你的awk程序可以沒有開始塊部分】?
主體塊(Body Block):?
語法:?
/pattern/{awk-commands}?
針對每一個(gè)輸入的行都會(huì)執(zhí)行一次主體部分的命令,默認(rèn)情況下,對于輸入的每一行,awk都會(huì)執(zhí)行主體部分的命令,但是我可以使用/pattern/限制其在指定模式下。?
結(jié)束塊(END BLOCK):?
語法:?
END{awk-commands}?
結(jié)束塊是awk程序結(jié)束時(shí)執(zhí)行的代碼(在處理完輸入流之后執(zhí)行),END也是awk的關(guān)鍵字,必須大寫,與開始塊類似,結(jié)束塊也是可選的。?
題目:有一個(gè)文本a.txt,內(nèi)容如下:?
1 zhengchengcheng math 100?
2 wangbin chinese 80?
3 wangcheng pgysical 85?
4 lily english 75?
5 mary history 90?
使用awk將其標(biāo)準(zhǔn)輸出并附帶表頭信息??
解答:?
一般情況下,我們使用awk命令行模式比較多,即直接使用awk命令處理文本數(shù)據(jù);?
Awk命令行格式如下:?
awk [options] ‘{awk-commands}’ file?
當(dāng)然,除了直接使用awk命令來處理文本之外,我們還可以將awk命令寫成腳本來執(zhí)行,即awk程序文件。?
Awk程序文件執(zhí)行格式如下:?
awk [options] -f file?
常用的awk選項(xiàng)如下:?
-v:這個(gè)選項(xiàng)可以為變量賦值,它允許在程序執(zhí)行之前為變量賦值【注:一般用法即在程序執(zhí)行前為變量賦值】?
例如:?
執(zhí)行結(jié)果如下:?
--dump-variables[=file]:此選項(xiàng)會(huì)將awk全局變量及相應(yīng)值按序輸出到指定文件中,不指定文件,默認(rèn)輸出文件名是awkvars.out?
執(zhí)行結(jié)果如下:?
awk --dump-variables=/tmp/xin "" 【注:’’引號不能少,不然會(huì)報(bào)錯(cuò),代表awk主體部分;--dump-variables=/tmp/xin表示將內(nèi)容輸出到/tmp/xin文件中去】?
--lint[=fatal]:這個(gè)選項(xiàng)用于檢測程序的可移植情況以及代碼中的可以部分,如果提供了參數(shù)fatal,awk會(huì)將所有的警告信息當(dāng)錯(cuò)誤信息輸出。?
例如:awk --lint "" /tmp/xin 【注:同樣,強(qiáng)調(diào)一遍,主題部分不能省略,沒處理命令使用’’代替即可,檢測文件為/tmp/xin】?
執(zhí)行結(jié)果如下:?
--profile[=file]:此選項(xiàng)會(huì)將程序文件以一種很優(yōu)美的格式輸出(常用來格式化awk腳本文件),默認(rèn)輸出文件是awkprof.out,[=file]表示將格式化后的腳本內(nèi)容輸出到指定文件。?
例如:awk -F" " --profile=/tmp/awk.sh "BEGIN{printf "No\tName\t\tCourse\tGrade\n\n"} {print $0} END{print"\n-----The End-----"}" a.txt 【注:使用awk格式化輸出a.txt內(nèi)容,并將命令以一種優(yōu)美的方式輸出到/tmp/awk.sh文件中去】?
執(zhí)行結(jié)果如下:?
--version:顯示awk版本信息。?
命令:awk --version?
-F:指定域分隔符。【用來分隔每條記錄中各個(gè)域的】?
例如:awk -F":" "{print $1}" /etc/passwd 【注:打印系統(tǒng)所有的用戶;$1代表第一個(gè)域】?
執(zhí)行結(jié)果如下:?
我們以a.txt文件作為示例文件,a.txt文件內(nèi)容如下:?
在awk中,對于輸入流,輸入的每行,叫做一條記錄;每一條記錄中以分隔符分隔的各個(gè)部分叫做域,awk每次載入一條記錄進(jìn)行處理,默認(rèn)的分隔符為空格。?
例如:打印出a.txt文件中姓名和成績這兩列,使用awk進(jìn)行操作;?
命令:awk -F" " "{print $2,$4}" a.txt | column -t 【注:column -t是按比較美觀的格式顯示輸出】?
執(zhí)行結(jié)果如下:?
$0代表輸出整條記錄。?
例如:輸出姓名為wangbin的那行,用awk去實(shí)現(xiàn)??
命令:awk -F" " "/wangbin/{print $0}" a.txt 【這條語句先用/pattern/去匹配,匹配到后在輸出整行內(nèi)容】?
執(zhí)行結(jié)果如下:?
【注:如果沒有主體塊(即:{print $0}),則默認(rèn)是輸出記錄(行)】?
例如:輸出姓名為wangbin那行中的第1,2,4列,用awk實(shí)現(xiàn)??
命令:awk -F" " "/wangbin/{print $1,$2,$4}" a.txt ?
執(zhí)行結(jié)果如下:?
例如:計(jì)算姓名以w開頭的行的個(gè)數(shù),用awk實(shí)現(xiàn)??
命令:?
或?
awk -F" " "/w/{++count} END {printf "count is: %d\n",count}" a.txt ?
執(zhí)行結(jié)果如下:?
例如:打印輸出字符串個(gè)數(shù)多于33的行,用awk實(shí)現(xiàn)??
命令:awk -F" " "length($0) > 33{print $0}" a.txt ?
或者?
awk -F" " "length($0) > 33" a.txt ?
執(zhí)行結(jié)果如下:?
【注:length函數(shù)是awk的內(nèi)置函數(shù),該函數(shù)返回字符串的長度,變量$0表示整行,缺失的主體塊會(huì)執(zhí)行默認(rèn)動(dòng)作(打印輸出);如果一行中的字符數(shù)超過33,則length($0) > 33為真,則打印輸出,否則不打印】?
Awk提供了一些內(nèi)置變量,在寫腳本或?qū)嶋H運(yùn)用中起到很重要的作用。?
(1)ARGC?
ARGC表示在命令行提供的參數(shù)的個(gè)數(shù);【注:實(shí)際參數(shù)個(gè)數(shù)=ARGC -1,因?yàn)榈谝粋€(gè)參數(shù)永遠(yuǎn)是awk】?
例如:awk "BEGIN{print "arguments = ",ARGC -1}" xin ss ll w?
執(zhí)行結(jié)果如下:?
【注:從上面可以看出,ARGC = 實(shí)際參數(shù)個(gè)數(shù)+1】?
(2)ARGV?
ARGV表示將命令行輸出的參數(shù)存儲為一個(gè)數(shù)組,ARGV即是這個(gè)數(shù)組的名稱;數(shù)組的有效索引從0到ARGC-1;?
例如:awk "BEGIN{for(i=0;i 執(zhí)行結(jié)果如下:? 【注:第一個(gè)參數(shù)永遠(yuǎn)是awk,索引號為0】? (3)ENVIRON? ENVIRON表示與環(huán)境變量相關(guān)的關(guān)聯(lián)數(shù)組變量;【注:即使用這個(gè)內(nèi)置變量可以查看當(dāng)前系統(tǒng)環(huán)境下的環(huán)境變量設(shè)置,用法為ENVIRON[“環(huán)境變量名”]】? 例如:? awk "BEGIN{print ENVIRON["SHELL"]}"? awk "BEGIN{print ENVIRON["PATH"]}"? 執(zhí)行結(jié)果如下:? (4)FILENAME? FILENAME表示當(dāng)前文件名稱;? 例如:awk "END{print FILENAME}" a.txt ? 執(zhí)行結(jié)果如下:? 【注:開始塊中FILENAME未定義,因?yàn)锽EGIN開始塊是在文本處理操作之前執(zhí)行的,所以FILENAME還沒定義,該變量的值為空;一般用于END結(jié)束塊,打印出當(dāng)前文件名稱】? (5)FS? FS表示輸入時(shí)的域分隔符,其默認(rèn)值是空格,可以使用-F參數(shù)指定與分隔符;? 例如:awk "BEGIN{print "FS=" FS}" | cat -A? 執(zhí)行結(jié)果如下:? 【注:cat -A是顯示行結(jié)束標(biāo)識符,linux默認(rèn)是$;可以看出FS默認(rèn)是空格】? 也可以使用-F參數(shù)指定域分隔符;? 例如:awk -F: "BEGIN{print "FS=" FS}" | cat -A? 執(zhí)行結(jié)果如下:? 【注:上圖顯示FS變成了:】? (6)OFS? OFS表示輸出時(shí)的域分隔符,其默認(rèn)值也是空格;? 例如:打印輸出a.txt文件中的第2,3列,并改變與分隔符為”--”,使用awk實(shí)現(xiàn);? 命令:? 執(zhí)行結(jié)果如下:? (7)NF? NF代表當(dāng)前輸入記錄中域的數(shù)量;? 例如:匹配輸出姓名為wangbin的行,并顯示這行的域總數(shù);? 命令:awk -F" " "/wangbin/{printf "context: (%s)\nNF: (%s)\n",$0,NF}" a.txt | column -t? 執(zhí)行結(jié)果如下:? (8)NR? NR表示當(dāng)前輸入記錄數(shù)(即行號);? 例如:打印輸出a.txt文件第2-4行(即1 命令:awk -F" " "{if(NR<=4 && NR>1) print NR,$0}" a.txt | column -t? 執(zhí)行結(jié)果如下:? (9)FNR? FNR也表示記錄數(shù)(行號),與NR類似,但是不同在于它是相對于文件而言的,此變量在處理多個(gè)文件時(shí)有重要的作用,每當(dāng)從新的文件讀入時(shí),F(xiàn)NR都會(huì)被重新置為0;? NR與FNR比較:? 例如:現(xiàn)在有兩個(gè)文件a.txt,b.txt,現(xiàn)在要求打印輸出并添加行號,分別使用NR和FNR對比效果;? NR顯示結(jié)果:? 【注:如上圖執(zhí)行結(jié)果顯示,NR是相對于整個(gè)輸入流而言,行號不斷從1開始遞增,所以無法通過NR來區(qū)分多個(gè)文件】? FNR顯示結(jié)果:? 【注:如上圖結(jié)果顯示,F(xiàn)NR是相對于文件而言的,當(dāng)讀入新文件時(shí),F(xiàn)NR會(huì)被重新置為0,即當(dāng)一個(gè)文件結(jié)束,開始讀入第二個(gè)文件時(shí),行號重新從1開始遞增,所以可以通過FNR來區(qū)分多個(gè)文件】? (10)RS? RS表示輸入記錄(行)分隔符【即輸入時(shí)的記錄分隔符】,默認(rèn)是換行符,可以使用RS指定輸入記錄分隔符;? 例如:echo "1,1--2,2--3,3--4,4--5,5" | awk -F"," "BEGIN{RS="--"}{print $0}"? 上面的語句:輸入文本內(nèi)容為"1,1--2,2--3,3--4,4--5,5",默認(rèn)的記錄分隔符為換行符,我們使用RS="--"指定記錄分隔符為--后,awk主體程序就需要處理五條記錄【這五條記錄分別為:1,1、2,2、3,3、4,4、5,5】? 執(zhí)行結(jié)果如下:? 【注:以上就是顯示的結(jié)果,當(dāng)然大家可能會(huì)發(fā)現(xiàn)為什么結(jié)尾會(huì)多一個(gè)空包行呢,print最后默認(rèn)就會(huì)輸出一個(gè)換行,這個(gè)可以不用理會(huì)】? (11)ORS? ORS表示輸出記錄(行)分隔符【即輸出時(shí)的記錄分隔符】,默認(rèn)是換行符,可以使用ORS指定輸出記錄分隔符;? 例如:將a.txt文件不換行輸出,并指定輸出記錄分隔符為||,用來區(qū)分原來的每一條記錄,用awk實(shí)現(xiàn);? 命令:awk "{ORS=" || ";print $0}" a.txt? 執(zhí)行結(jié)果如下:? 【結(jié)果顯示,已將換行符換成了||】? (12)RLENGTH? RLENGTH表示match函數(shù)匹配的字符串長度,awk的match函數(shù)用于在輸入的字符串中搜索指定字符串;? 例如:awk "BEGIN{if(match("this is good","good"));print RLENGTH}" 【表示match函數(shù)在輸入字符串中匹配good字符串,RLENGTH返回匹配到的good字符串的長度】? 執(zhí)行結(jié)果如下:? (13)RSTART? RSTART表示由match函數(shù)匹配的字符串的第一個(gè)字符的位置【注:是匹配字符串的第一個(gè)字符在所有輸入的內(nèi)容中的位置】;? 例如:awk "BEGIN{if(match("this is good","good"));print RSTART}" 【這表示match匹配到的good字符串中的第一個(gè)字符”g”在輸入內(nèi)容中”this is good”的位置】? 執(zhí)行結(jié)果如下:? $0表示輸入的整個(gè)輸入記錄;? (15)$n? $n表示當(dāng)前輸入記錄的第n個(gè)域,這些域之間由FS分隔,n的取值為1,2,3......;? ARGIND表示當(dāng)前文件中正在處理的ARGV數(shù)組的索引值;? 例子:有三個(gè)文件分別是junk1、junk2、junk3,每個(gè)文件中都有兩行;? 命令:? 執(zhí)行結(jié)果如下:? 【注:ARGIND其實(shí)就是每個(gè)文件的序列號,例如第一個(gè)文件是junk1,那么這時(shí)ARGIND=1,且會(huì)遍歷該文件中所有行,有多少行就會(huì)輸出多少個(gè)ARGIND=1(這變量生產(chǎn)中我一次也沒用到過)】? ERRNO用于存儲當(dāng)getline重定向失敗或者close函數(shù)調(diào)用失敗時(shí)的失敗信息;? 例子:awk "BEGIN{ret=getline<"xin.t";if(ret==-1) print "error: ",ERRNO}"? 執(zhí)行結(jié)果如下:? 【注:因?yàn)閤in.t這個(gè)文件并不存在,報(bào)錯(cuò),錯(cuò)誤信息保存到了ERROR變量中】? IGNORECASE表示忽略大小寫;? 例如:找出a.txt文件中name=wangbin這一行;使用awk這一行? 首先不開啟,即IGNORECASE=0的情況(區(qū)分大小寫):? 執(zhí)行結(jié)果如下:? 開啟IGNORECASE,即IGNORECASE=1的情況(忽略大小寫):? 執(zhí)行結(jié)果如下:? TEXTDOMAIN表示awk程序當(dāng)前文本域,它主要是來尋找程序中字符串的本地翻譯,用于程序的國際化;默認(rèn)值是messages;? 例如:? 執(zhí)行結(jié)果如下:? 例子:awk "BEGIN{a=5;b=3;printf "a + b = %d\n",a+b}" ? 或者? awk "BEGIN{a=5;b=3;print "a + b =",a+b}"? 執(zhí)行結(jié)果如下:? 例子:awk "BEGIN{a=5;b=3;printf "a - b = %d\n",a-b}" ? 或者? awk "BEGIN{a=5;b=3;print "a - b =",a-b}"? 執(zhí)行結(jié)果如下:? 例子:awk "BEGIN{a=5;b=3;printf "a * b = %d\n",a*b}" ? 或者? awk "BEGIN{a=5;b=3;print "a * b =",a*b}"? 執(zhí)行結(jié)果如下:? 例子:awk "BEGIN{a=5;b=3;printf "a / b = %d\n",a/b}" 【結(jié)果只保留整數(shù)】? 【結(jié)果保留3位精度】? 或者? 【默認(rèn)print輸出保留5位精度】? 執(zhí)行結(jié)果如下:? 例子:awk "BEGIN{a=5;b=3;printf "a % b = %d\n",a%b}" ? 或者? awk "BEGIN{a=5;b=3;print "a % b =",a%b}" ? 執(zhí)行結(jié)果如下:? 例子:awk "BEGIN{a=5;b=++a;printf "a = %d, b = %d\n",a,b}"? 執(zhí)行結(jié)果如下:? 【注:b=++a表示先執(zhí)行遞增操作,后執(zhí)行賦值操作,即先執(zhí)行a=a+1,在執(zhí)行b=a,所以結(jié)果a和b都為6】? 例子:awk "BEGIN{a=5;b=a++;printf "a = %d, b = %d\n",a,b}"? 執(zhí)行結(jié)果如下:? 【注:b=a++表示先執(zhí)行賦值操作,后執(zhí)行遞增操作,即先執(zhí)行b=a,再執(zhí)行a=a+1,所以結(jié)果a=6,b=5】? 例子:awk "BEGIN{a=5;b=--a;printf "a = %d, b = %d\n",a,b}"? 執(zhí)行結(jié)果如下:? 【注:b=--a表示先執(zhí)行遞減操作,后執(zhí)行賦值操作,即先執(zhí)行a=a-1,再執(zhí)行b=a,所以結(jié)果a=4,b=4】? 例子:awk "BEGIN{a=5;b=a--;printf "a = %d, b = %d\n",a,b}"? 執(zhí)行結(jié)果如下:? 【注:b=a--表示先執(zhí)行賦值操作,后執(zhí)行遞減操作,即先執(zhí)行b=a,再執(zhí)行a=a-1,所以結(jié)果a=4,b=5】? 例子:awk "BEGIN{name = "zx";printf "name = %s\n",name}"? 執(zhí)行結(jié)果如下:? 例子:awk "BEGIN{cnt=10;cnt+=10;printf "cnt = %d\n",cnt}"? 執(zhí)行結(jié)果如下:? 【注:首先給cnt變量賦值為10,在使用加法賦值將cnt值增加10;cnt+=10等價(jià)于cnt=cnt+10】? 例子:awk "BEGIN{cnt=90;cnt-=10;printf "cnt = %d\n",cnt}"? 執(zhí)行結(jié)果如下:? 【注:首先給cnt變量賦值為90,再使用減法賦值將cnt的值減少10;cnt-=10等價(jià)于? cnt=cnt-10】? 例子:awk "BEGIN{cnt=90;cnt*=10;printf "cnt = %d\n",cnt}" ? 執(zhí)行結(jié)果如下:? 【注:首先給cnt變量賦值為90,再使用乘法賦值將cnt乘以10;cnt*=10登記于cnt=cnt*10】? 例子:awk "BEGIN{cnt=90;cnt/=13;printf "cnt = %d\n",cnt}" 【結(jié)果只保留整數(shù)部分】? 【結(jié)果保留3位精度】? 或者? 【默認(rèn)print輸出保留5位精度】? 執(zhí)行結(jié)果如下:? 【注:首先給cnt變量賦值為90,再使用除法賦值將cnt除以13;cnt/=13登記于cnt=cnt/13】? 例子:awk "BEGIN{cnt=90;cnt%=13;print "cnt =",cnt}" ? 執(zhí)行結(jié)果如下:? 【注:首先給cnt變量賦值為90,再使用模運(yùn)算賦值將cnt除以13取余數(shù);cnt%=13等價(jià)于cnt=cnt%13】? 例子:awk "BEGIN{cnt=3;cnt^=3;print "cnt =",cnt}"? 執(zhí)行結(jié)果:? 【注:首先給cnt變量賦值為3,再使用指數(shù)賦值計(jì)算cnt的次冪;cnt^=3等價(jià)于cnt=cnt^3】? 例子:awk "BEGIN{a=5;b=6;if(a == b) print "a == b";else print "a!=b"}"? 執(zhí)行結(jié)果如下:? 例子:awk "BEGIN{a=5;b=6;if(a != b) print "true";else print "false"}"? 執(zhí)行結(jié)果如下:? 例子:awk "BEGIN{a=5;b=6;if(a < b) print "true";else print "false"}"? 執(zhí)行結(jié)果如下:? 例子:awk "BEGIN{a=5;b=6;if(a > b) print "true";else print "false"}"? 執(zhí)行結(jié)果如下:? 例子:awk "BEGIN{a=5;b=6;if(a >= b) print "true";else print "false"}"? 執(zhí)行結(jié)果如下:? 例子:awk "BEGIN{a=5;b=6;if(a <= b) print "true";else print "false"}"? 執(zhí)行結(jié)果如下:? 語法:expr1 && expr2 ? 解釋說明:如果expr1和expr2均為真,則最終結(jié)果為真,否則為假;【注:如果expr1為真時(shí)才會(huì)執(zhí)行expr2表達(dá)式,若expr1為假,則直接返回結(jié)果為假】? 例子:awk "BEGIN{a=6;if(a > 0 && a < 6) print "true";else print "false"}"? 或者? awk "BEGIN{a=6;if(a > 0 && a <= 6) print "true";else print "false"}"? 執(zhí)行結(jié)果如下:? 語法:expr1 || expr2? 解釋說明:如果expr1和expr2至少其中一個(gè)為真,則最終結(jié)果為真,二者均為假時(shí)結(jié)果才為假;【注:如果expr1為假時(shí)才會(huì)執(zhí)行expr2表達(dá)式,若expr1為真,則不會(huì)再執(zhí)行expr表達(dá)式,直接返回結(jié)果為真】? 例子:awk "BEGIN{a=6;if(a > 0 || a < 6) print "true";else print "false"}"? 或者? awk "BEGIN{a=6;if(a < 0 || a < 6) print "true";else print "false"}"? 執(zhí)行結(jié)果如下:? 語法:!expr1? 解釋說明:邏輯非將expr1的值取反,如果expr1為真,則返回0,否則返回1;? 例子:? 執(zhí)行結(jié)果如下:? 【注:length(name)是用來判斷name變量是否為空,不為空為真(0),為空為假(1)】? 語法:condition expression?statement1:statement2? 解釋說明:當(dāng)條件表達(dá)式(condition expression)為真時(shí),statement1執(zhí)行,否則statement2執(zhí)行。? 例子:以下例子是打印最大值;? awk "BEGIN{a=20;b=30;c=40;(a>b)?max=a:max=b;(c>max)?max=c:max=max;print "Max is: " max}"? 執(zhí)行結(jié)果如下:? 一元加運(yùn)算符表示為+,它將操作數(shù)乘以+1;? 例子:? 執(zhí)行結(jié)果如下:? 【注:首先給a變量賦值-10,a=+a表示a=a*1,最終結(jié)果為-10】? 一元減運(yùn)算符表示為-,它將操作數(shù)乘以-1;? 例子:awk "BEGIN { a = -10; a = -a; print "a =", a }"? 執(zhí)行結(jié)果如下:? 【注:首先給a變量賦值-10,a=-a表示a=a*(-1),最終結(jié)果為10】? 空格操作符(space)可以完成兩個(gè)字符串的連接操作;? 例子:awk "BEGIN { str1="Hello,"; str2="World"; str3 = str1 str2; print str3 }" ? 執(zhí)行結(jié)果如下:? 【注:str3 = str1 str2表示將str1和str2的值拼接在一起賦值給str3,然后打印輸出str3】? 數(shù)組成員操作符為in,該操作符用于訪問數(shù)組元素。? 例子:? 執(zhí)行結(jié)果如下:? 【注:這個(gè)例子中i代表a數(shù)組中的元素的下標(biāo),打印輸出數(shù)組中所有元素】? 匹配操作符是~,它用于搜索包含匹配模式字符串的域;? 例如:打印輸出a.txt文件中姓名包含w字符的行;用awk實(shí)現(xiàn)。? awk -F" " "$2~"w"{print $0}" a.txt? 執(zhí)行結(jié)果如下:? 匹配操作符是!~,它用于搜索不包含匹配模式字符串的域;? 例如:打印輸出a.txt文件中姓名不包含w字符的行;用awk實(shí)現(xiàn)。? awk -F" " "$2!~"w"{print $0}" a.txt? 執(zhí)行結(jié)果如下:? 點(diǎn)字符(.)可以匹配除了行結(jié)束符的任意單個(gè)字符;【如果要匹配行結(jié)束符$,需要用\轉(zhuǎn)義】? 例如:echo -e "ww\nw\$wl\nfds\n\$\$\$\nxxxw" | awk "/.w/" ? 執(zhí)行結(jié)果如下:? 行開始符(^)匹配一行的開始;? 例如:echo -e "ww\nw\$wl\nfds\n\$\$\$\nxxxw" | awk "/^w/"? 執(zhí)行結(jié)果如下:? 【注:匹配以w字符開頭的行】? 行結(jié)束符($)匹配一行的結(jié)束;? 例如:echo -e "ww\nw\$wl\nfds\n\$\$\$\nxxxw" | awk "/w$/"? 執(zhí)行結(jié)果如下:? 匹配字符集用于匹配集合(由方括號表示)中的一個(gè)字符;? 例如:echo -e "ww\nw\$wl\nfds\n\$\$\$\nxxxw" | awk "/^[w$]./" 【匹配行開始為w或$的行】? 執(zhí)行結(jié)果如下:? 正則匹配時(shí)會(huì)排除集合中的字符;? 例如:echo -e "ww\nw\$wl\nfds\n\$\$\$\nxxxw" | awk "/^[^w$]/" 【排除以w或$開始的行】? 執(zhí)行結(jié)果如下:? 豎線(|)允許正則表達(dá)式實(shí)現(xiàn)邏輯或運(yùn)算;? 例如:echo -e "ww\nw\$wl\nfds\n\$\$\$\nxxxw\n\$\$w" | awk "/ww|.*w$/"? 執(zhí)行結(jié)果如下:? ?表示前面的字符不出現(xiàn)或者出現(xiàn)一次;【?前面的字符作為參考字符,不算在初始內(nèi)容內(nèi)】? 例子:echo -e "cax\ncatx\ncattx" | awk "/cat?x/"? 執(zhí)行結(jié)果如下:? 【注:上述例子表示打印輸出匹配前面的t 0次或1次的行】? 【注:參考字符為t,得出的結(jié)果分別匹配t:0次、1次】? +表示匹配前面的字符至少一次;? 例子:echo -e "cax\ncatx\ncattx" | awk "/cat+x/"? 執(zhí)行結(jié)果如下:? 【注:參考字符為t,得出的結(jié)果分別匹配t:1次、2次】? *表示匹配前面的字符任意個(gè);? 例子:echo -e "cax\ncatx\ncattx" | awk "/cat*x/"? 執(zhí)行結(jié)果如下:? 【注:參考字符為t,得出的結(jié)果分別匹配t:0次、1次、2次】? ()用于分組,|用來提供多種選擇;? 例子:echo -e "cax\ncatx\ncattx" | awk "/ca(x|tx)/"? 執(zhí)行結(jié)果如下:? AWK 有關(guān)聯(lián)數(shù)組這種數(shù)據(jù)結(jié)構(gòu),而這種數(shù)據(jù)結(jié)構(gòu)最好的一個(gè)特點(diǎn)就是它的索引值不需要是連續(xù)的整數(shù)值。我們既可以使用數(shù)字也可以使用字符串作為數(shù)組的索引。除此之外,關(guān)聯(lián)數(shù)組也不需要提前聲明其大小,因?yàn)樗谶\(yùn)行時(shí)可以自動(dòng)的增大或減小。? awk數(shù)組語法:? array_name[index]=value? 【其中array_name是數(shù)組名稱,index是數(shù)組索引,value是數(shù)組元素所賦予的值】? 例如:創(chuàng)建一個(gè)數(shù)組age;使用awk實(shí)現(xiàn);? awk "BEGIN{age["zx"]=25;age["wc"]=26;age["wb"]=27;for(i in age) printf "age[%s]\t= %d\n",i,age[i]}"? 執(zhí)行結(jié)果如下:? 【注:上面的例子表示的是定義一個(gè)數(shù)組age,并打印age數(shù)組中所有的元素】? 訪問數(shù)組中元素:arrary_name[index]? 刪除數(shù)組元素語法:delete array_name[index]? 例如:awk "BEGIN{age["zx"]=25;age["wc"]=26;age["wb"]=27;delete age["zx"];for(i in age) printf "age[%s]\t= %d\n",i,age[i]}"? 執(zhí)行結(jié)果如下:? Awk本身只支持多維數(shù)組,不過我們可以很容易的使用一維數(shù)組模擬多維數(shù)組;? 例如:以下是一個(gè)二維數(shù)組:? 100 200 300? 400 500 600? 700 800 900? 【上面的實(shí)例中,array[0][0] 存儲 100,array[0][1] 存儲 200 ,依次類推】? 在awk中,為了在array[0][0]處存儲100,我們可以使用如下語法:? array[“0,0”] = 100 【該實(shí)例中我們使用0,0作為索引,但是這并不是兩個(gè)索引,事實(shí)上,它是一個(gè)字符串索引0,0】? 例子:打印輸出上述二維數(shù)組,使用awk實(shí)現(xiàn);? awk "BEGIN{a["0,0"] = 100;a["0,1"] = 200;\? a["0,2"] = 300;a["1,0"] = 400;\? a["1,1"] = 500;a["1,2"] = 600;\? a["2,0"] = 700;a["2,1"] = 800;\? a["2,2"] = 900;printf "a[0][0] = %s\n",a["0,0"];\? printf "a[0][1] = %s\n",a["0,1"];printf "a[0][2] = %s\n",a["0,2"];\? printf "a[1][0] = %s\n",a["1,0"];printf "a[1][1] = %s\n",a["1,1"];\? printf "a[1][2] = %s\n",a["1,2"];printf "a[2][0] = %s\n",a["2,0"];\? printf "a[2][1] = %s\n",a["2,1"];printf "a[2][2] = %s\n",a["2,2"];? }"? 執(zhí)行結(jié)果如下:? 與其實(shí)的編程語言一樣,AWK 同樣提供了條件語句控制程序的執(zhí)行流程;? 條件語句測試條件然后根據(jù)條件選擇執(zhí)行相應(yīng)的動(dòng)作。下面是條件語句的語法:? 第一種寫法:? if(condition)? action? 第二種寫法:? if(condition)? {? action 1? action 2? ......? action n? }? 例子:判斷數(shù)字為奇數(shù)還是偶數(shù)?? awk "BEGIN{a = 10;if(a%2==0) print "a is oushu";else print "a is jishu"}"? 或者? awk -v a=21 "BEGIN{if(a%2==0) print "a is oushu";else print "a is jishu"}"? 執(zhí)行結(jié)果如下:? if-else語句中允許在條件為假時(shí)執(zhí)行另外一組的動(dòng)作。下面為:? if (condition)? action-1? else? action-2? 例子:awk "BEGIN{a = 30;b = 20;if(a==b) print "a = b";else print "a != b"}"? 執(zhí)行結(jié)果如下:? 使用多個(gè)【類似于shell的if-elif-else語法】;? if-else-if語法:? if(condition-1)? action-1? else if(condition-2)? action2? else if(condition-3)? action3? else? action4? 例子:awk "BEGIN{a = 30;b = 20;if(a==b) print "a = b";else if(a>b) print "a > b";else print "a < b"}"? 執(zhí)行結(jié)果如下:? 除了前面介紹的條件語句,AWK 還提供了循環(huán)語句。該語句的作用就是當(dāng)條件為真時(shí)重復(fù)執(zhí)行一系列的命令。? for 循環(huán)的語法如下:? for (initialisation; condition; increment/decrement)? {? action? }? 【For 語句首先執(zhí)行初始化動(dòng)作( initialisation ),然后再檢查條件( condition )。如果條件為真,則執(zhí)行動(dòng)作( action ),然后執(zhí)行遞增( increment )或者遞減( decrement )操作。只要條件為真循環(huán)就會(huì)一直執(zhí)行。每次循環(huán)結(jié)束都會(huì)進(jìn)條件檢查,若條件為假則結(jié)束 循環(huán)】? 例子:分別打印輸出a.txt文件中的奇數(shù)行與偶數(shù)行?? awk "{for(i=1;i<=NR;i++) {if(i%2==0 && i==NR) print$0}}" a.txt? 或者? awk "{for(i=1;i<=NR;i++) {if(i%2!=0 && i==NR) print$0}}" a.txt? 執(zhí)行結(jié)果如下:? 【注:for循環(huán)語句循環(huán)體可以不加{},但是為了規(guī)范還是加上比較好,以防出錯(cuò),】? While 循環(huán)會(huì)一直執(zhí)行動(dòng)作直到邏輯條件為假為止。其語法如下:? while (condition)? {? action1? action2? ......? }? 【AWK 首先檢查條件是否為真,若條件為真則執(zhí)行動(dòng)作。此過程一直重復(fù)直到條件為假時(shí),則停止?!? 例子:循環(huán)打印輸出1到5;? awk "BEGIN{i=1;while(i<6) {print i;i++}}" 【while后面執(zhí)行的action一定要加{},不然無限循環(huán)打印1】? 執(zhí)行結(jié)果如下:? 【注:這里while循環(huán)循環(huán)體要加{},不然會(huì)不斷輸出1,所以為了程序不出現(xiàn)錯(cuò)誤,循環(huán)體統(tǒng)一放在{}中去】? Do-While 循環(huán)與 While 循環(huán)相似,但是 Do-While 的條件測試放到了循環(huán)的尾部。下面是? do? {? action? }? while (condition)? 【注:在;而while循環(huán)是先判斷條件在執(zhí)行】? 例子:awk "BEGIN{i=1;do {print i;++i} while(i<6)}" ? 執(zhí)行結(jié)果如下:? break用于結(jié)束整個(gè)循環(huán),同其他編程語言的用法;? 例子:打印輸出1-9 九個(gè)整數(shù);? awk "BEGIN{for(i=1;;i++) {if(i>=10) break;else print i}}"? 執(zhí)行結(jié)果如下:? 【當(dāng)i>=10時(shí),執(zhí)行break,就跳出整個(gè)循環(huán)】? continue 語句用于在循環(huán)體內(nèi)部結(jié)束本次循環(huán),從而直接進(jìn)入下一次循環(huán)迭代;? 例子:打印輸出1-10之間的奇數(shù);? awk "BEGIN{for(i=1;i<=10;i++) {if(i%2==0) continue;else print i}}"? 執(zhí)行結(jié)果如下:? 【當(dāng)i%2==0時(shí),執(zhí)行continue,就跳出本次循環(huán),進(jìn)入下一次循環(huán)】? Exit 用于結(jié)束腳本程序的執(zhí)行。該函數(shù)接受一個(gè)整數(shù)作為參數(shù)表示 AWK 進(jìn)程結(jié)束狀態(tài)。 如果沒有提供該參數(shù),其默認(rèn)狀態(tài)為 0 ;? 例子:awk "BEGIN{print "------now,start------";sum=0;for(i=0;i<20;i++) {sum+=i;if(sum>30) exit(5);else print "sum =" sum}}"? 執(zhí)行結(jié)果如下:? 【注:執(zhí)行完畢后,使用echo $?查看退出碼是否是exit()中定義的退出碼】? AWK 為程序開發(fā)者提供了豐富的內(nèi)置函數(shù)。這一章節(jié)會(huì)講解 AWK 提供的算術(shù)函數(shù)、字符串操作函數(shù)、時(shí)間操作相關(guān)的函數(shù)、位操作函數(shù)以及其它各種各樣的函數(shù)。? 此函數(shù)返回?cái)?shù)值;? 例子:awk "BEGIN{a=100.24567;result=int(a);printf "a = %0.5f\nresult = %s\n" ,a,result}"? 執(zhí)行結(jié)果如下:? Rand()函數(shù)返回一個(gè)大于等于;? 例子:? 執(zhí)行結(jié)果如下:? 此函數(shù)計(jì)算;? 例子:awk "BEGIN{a=256;printf "sqrt(%f) = %f\n",a,sqrt(a)}"? 執(zhí)行結(jié)果如下:? asort 函數(shù)使用 GAWK 值比較的一般規(guī)則排序 arr 中的內(nèi)容,然后用以 1 開始的有序整數(shù)替換排序內(nèi)容的索引。【asort按ASCII碼的順序排序arr中元素的內(nèi)容,然后以從1開始的有序整數(shù)替換排序內(nèi)容的索引】? 例子:awk "BEGIN {? arr[0] = "Three"? arr[1] = "One"? arr[2] = "Two"? print "Array elements before sorting:"? for (i in arr) {? printf "arr[%d] = %s\n",i,arr[i]? }? asort(arr)? print "Array elements after sorting:"? for (i in arr) {? printf "arr[%d] = %s\n",i,arr[i]? }? }"? 執(zhí)行結(jié)果如下:? 【注:使用asort()函數(shù)前后對比,asort()是將arr數(shù)組元素的內(nèi)容先進(jìn)行排序,按照ASCII碼的順序進(jìn)行排序,排序完內(nèi)容后,然后針對內(nèi)容以從1開始的有序整數(shù)排序索引】? asorti 函數(shù)的行為與 asort 函數(shù)的行為很相似,二者的差別在于 aosrt 對數(shù)組的值排序,而 asorti 對數(shù)組的索引排序;【即arr數(shù)組中元素的值變成了索引,然后以從1開始的有序整數(shù)作為排序索引】? 例子:awk "BEGIN {? arr["The"] = 1? arr["One"] = 2? arr["Two"] = 3? print "Array elements before sorting:"? for (i in arr) {? printf "arr[%s] = %s\n",i,arr[i]? }? asorti(arr)? print "Array elements after sorting:"? for (i in arr) {? printf "arr[%s] = %s\n",i,arr[i]? }? }"? 執(zhí)行結(jié)果如下:? 【注:使用asorti()函數(shù)后,arr數(shù)組元素的值編程原來的索引,然后以1開始的有序整數(shù)作為新的索引打印輸出】? gsub 是全局替換( global substitution )的縮寫。它將出現(xiàn)的子串(regx)替換為sub。第三個(gè)參數(shù),Regx代表被替換的內(nèi)容,可以用正則表達(dá)式匹配,sub表示要替換成的內(nèi)容。? 例子:awk "BEGIN {? str = "Hello, World! The World" ? print "String before replacement = " str? gsub("W.*!", "Jerry", str)? print "String after replacement = " str? }"? 執(zhí)行結(jié)果如下:? index 函數(shù)用于檢測字符串 sub 是否是 str 的子串。如果 sub 是 str 的子串,則返回子串 sub 在字符串 str 的開始位置;若不是其子串,則返回 0。str 的字符位置索引從 1 開始計(jì)數(shù)。? 例子:awk "BEGIN{a="this is good";b="good";ret=index(a,b);print ret}"? 或者? awk "BEGIN{a="this is good";b="xx";ret=index(a,b);print ret}"? 執(zhí)行結(jié)果如下:? 【若b中所有的字符串不在a中,則返回0,否則返回b中最開始字符的索引位置】? length 函數(shù)返回字符串的長度;? 例子:awk "BEGIN{a="abcdref ed";print "length(a) = " length(a)}"? 執(zhí)行結(jié)果:? split 函數(shù)使用正則表達(dá)式 regex 分割字符串 str,分割后的所有結(jié)果存儲在數(shù)組【這里的regex表示分隔符,如果不指定的話按照FS來切割】? 例子:awk "BEGIN{a = "abc,def,hmn,xyz";print "---before split it---\n" a;\ ? print "\n---after split it---";split(a,b,",");for(i in b) printf "b[%d] = %s\n",i,b[i]}"? 執(zhí)行結(jié)果如下:? strtonum 將字符串 str 轉(zhuǎn)換為數(shù)值。 如果字符串以 0 開始,則將其當(dāng)作十進(jìn)制數(shù);如果字符串以 0x 或 0X 開始,則將其當(dāng)作十六進(jìn)制數(shù);否則,將其當(dāng)作浮點(diǎn)數(shù)。? 例子:awk "BEGIN {? print "Decimal num = " strtonum("123")? print "Octal num = " strtonum("0123")? print "Hexadecimal num = " strtonum("0x123")? }"? 執(zhí)行結(jié)果如下:? sub 函數(shù)執(zhí)行一次子串替換。它將第一次出現(xiàn)的子串regex用sub替換。第三個(gè)參數(shù)是可選的,默認(rèn)為? 例子:awk "BEGIN{a="hello world! the world";print "------before------\n" a"\n";\? sub("world","jerry",a);print "------after------\n" a}"? 執(zhí)行結(jié)果如下:? substr 函數(shù)返回 str 字符串中從第 start 個(gè)字符開始長度為 length的子串。如果沒有指定length的值,返回? 例子:awk "BEGIN{a="hello world!";b=substr(a,1,5);print b}"? 執(zhí)行結(jié)果如下:? 【注:返回a字符串中從第一個(gè)字符開始,長度為5的所有字符】? 此函數(shù)將字符串? 例子:awk "BEGIN{a="THIS IS MY NAME!";print tolower(a)}"? 執(zhí)行結(jié)果如下:? 此函數(shù)將字符串? 例子:awk "BEGIN{a="this is my name!";print toupper(a)}"? 執(zhí)行結(jié)果如下:? systime? mktime(dataspec)? strftime([format [, timestamp[, utc-flag]]])? 執(zhí)行位與操作【即兩個(gè)都為真才為真,1為真,0為假】;? 例子:awk "BEGIN{a=9;b=3;printf "(%d and %d) = %d\n",a,b,and(a,b)}"? 執(zhí)行結(jié)果如下:? 【注:9用二進(jìn)制表示為00001001,3用二進(jìn)制表示為00000011,然后執(zhí)行and操作,相與得出結(jié)果為00000001,用十進(jìn)制表示為1】? 左移位操作;? 例子:awk "BEGIN{a=10;printf "lshift(%d)by 1 = %d\n",a,lshift(a,1)}"? 執(zhí)行結(jié)果如下:? 【注:10用二進(jìn)制表示為00001010,執(zhí)行左移操作后變?yōu)?0010100,十進(jìn)制表示即變?yōu)?0】? 右移位操作;? 例子:awk "BEGIN{a=10;printf "rshift(%d)by 1 = %d\n",a,rshift(a,1)}"? 執(zhí)行結(jié)果如下:? 【注:10用二進(jìn)制表示為00001010,執(zhí)行右移位操作后變?yōu)?0000101,十進(jìn)制表示即變?yōu)?】? 按位或操作【即兩個(gè)都為假才為假,1為真,0為假】;? 例子:awk "BEGIN{a=9;b=3;printf "(%d or %d) = %d\n",a,b,or(a,b)}"? 執(zhí)行結(jié)果如下:? 【注:9用二進(jìn)制表示為00001001,3用二進(jìn)制表示為00000011,然后執(zhí)行or操作,得出結(jié)果為00001011,用十進(jìn)制表示為11】? 按位異或運(yùn)算【即兩個(gè)不同為真,相同則為假,1為真,0為假】? 例子:awk "BEGIN{a=9;b=3;printf "(%d xor %d) = %d\n",a,b,xor(a,b)}"? 執(zhí)行結(jié)果如下:? 【注:9用二進(jìn)制表示為00001001,3用二進(jìn)制表示為00000011,然后執(zhí)行xor操作,得出結(jié)果為00001010,用十進(jìn)制表示為10】? 關(guān)閉管道的文件。? 例子:awk "BEGIN {? cmd = "tr [a-z] [A-Z]"? print "hello, world !!!" |& cmd? close(cmd, "to")? cmd |& getline out? print out;? close(cmd);? }"? 執(zhí)行結(jié)果如下:? 解釋說明:? ? 第一條語句? ? 第二條語句? ? 第三條語句? ? 第四條語句? ? 接下來的輸出語句打印輸出的內(nèi)容,最后? delete 被用于從數(shù)組中刪除元素。下面的例子演示了如何使用 delete:? 例子:? awk "BEGIN {? arr[0] = "One"? arr[1] = "Two"? arr[2] = "Three"? arr[3] = "Four"? print "Array elements before delete operation:"? for (i in arr) {? print arr[i]? }? delete arr[0]? delete arr[1]? print "Array elements after delete operation:"? for (i in arr) {? print arr[i]? }? }"? 執(zhí)行結(jié)果如下:? 該函數(shù)終止腳本執(zhí)行。它可以接受可選的參數(shù);? 例子:? 【注:exit語句執(zhí)行完畢后,直接退出程序,不執(zhí)行print操作】? getline 函數(shù)讀入下一行;? 例子:? 執(zhí)行結(jié)果如下:? 腳本看似工作正常,但是第一行去哪兒了呢?讓我們理一下整個(gè)過程。剛啟動(dòng)時(shí),AWK 從文件 marks.txt 中讀入一行存儲到變量 $0 中。在下一條語句中,我們使用 getline 讀入下一行。 因此 AWK 讀入第二行并存儲到 $0中。最后,AWK 使用 print 輸出第二行的內(nèi)容。這個(gè)過程一直到文件結(jié)束。? next 停止處理當(dāng)前記錄,并且進(jìn)入到下一條記錄的處理過程。下面的例子中,當(dāng)模式串匹配成功后程序并不執(zhí)行任何操作;? 例子:awk "{if($2~/wang/) next;print $0}" a.txt? 執(zhí)行結(jié)果如下:? 【當(dāng)$2中包含wang字符串時(shí),就停止處理當(dāng)前記錄,直接進(jìn)入下一條記錄的處理過程】? nextfile 停止處理當(dāng)前文件,從下一個(gè)文件第一個(gè)記錄開始處理。? return 用于從用戶自定義的函數(shù)中返回值。請注意,如果沒有指定返回值,那么的返回值是未定義的。? 例子:? awk "function add(a,b){c = a + b;return c} BEGIN{res = add(11,20);print "11 + 20 = " res}"? 或者? awk "function add(a,b){c = a + b;return c} BEGIN{print "11 + 20 = ",add(11,20)}"? 執(zhí)行結(jié)果如下:? 【注:add是用戶自定義的函數(shù),可以在后面通過調(diào)用】? system 函數(shù)可以執(zhí)行特定的命令然后返回其退出狀態(tài)。返回值為 0 表示命令執(zhí)行成功;非 0 表示命令執(zhí)行失敗。? 例子:awk "BEGIN { ret = system("ifconfig eth0"); print "Return value = " ret }"? 執(zhí)行結(jié)果如下:? 函數(shù)是程序的基本構(gòu)造部分。AWK 允許我們自定義函數(shù)。事實(shí)上,大部分的程序功能都可以被切分成多個(gè)函數(shù),這樣每個(gè)函數(shù)可以獨(dú)立的編寫與測試。? 下面是用戶自定義函數(shù)的一般形式【類似于shell】:? function function_name(argument1, argument2, ...)? {? Function body? }? 上述定義函數(shù)的語法中:? function_name 是用戶自定義函數(shù)的名稱。函數(shù)名稱應(yīng)該以字母開頭,其后可以是數(shù)字、字母或下劃線的自由組合。? AWK 保留的關(guān)鍵字不能作為用戶自定義函數(shù)的名稱。? 自定義函數(shù)可以接受多個(gè)輸入?yún)?shù),這些參數(shù)之間通過逗號分隔。參數(shù)并不是必須的。我們也可以定義沒有任何輸入?yún)?shù)的函數(shù)。? function body 是函數(shù)體部分,它包含 AWK 程序代碼。? 例子:比較兩個(gè)數(shù)的大小,打印輸出最大值和最小值;? awk "function MAX_MIN_FIND(a,b,c) \? {? max=a;min=a;if(c > max) max=c;if(c < min) min=c;\? if(b > max) max=b;if(b < min) min=b;\? return max;min \? } \? BEGIN{MAX_MIN_FIND(5,25,1111);printf "max is %d \nmin is %d\n",max,min}"? 執(zhí)行結(jié)果如下:? 【注:把一個(gè)數(shù)作為標(biāo)準(zhǔn),然后另外兩個(gè)數(shù)與之對比】?awk特定變量(即專有變量)?
(1)ARGIND?
ERRNO?
IGNORECASE?
TEXTDOMAIN?
awk操作符?
算數(shù)運(yùn)算符?
加法(+)?
減法(-)?
乘法(*)?
除法(/)【awk除法可以保留精度】?
(5)模運(yùn)算符(%)【即取余運(yùn)算】?
遞增運(yùn)算符之前置遞增運(yùn)算(如++a)?
遞增運(yùn)算符之后置遞增運(yùn)算(如a++)?
遞減運(yùn)算符之前置遞減運(yùn)算(如--a)?
遞減運(yùn)算符之后置遞減運(yùn)算(如a--)?
賦值運(yùn)算符?
簡單賦值(=)?
加法賦值(+=)?
減法賦值(-=)?
乘法賦值(*=)?
除法賦值(/=)?
模運(yùn)算賦值(%=)?
指數(shù)賦值(^=)?
2、關(guān)系運(yùn)算符?
等于(==)?
不等于(!=)?
小于(<)?
大于(>)?
大于或等于(>=)?
小于或等于(<=)?
邏輯運(yùn)算符?
邏輯與(&&)?
邏輯或(||)?
(3)邏輯非(!)?
三元運(yùn)算符?
一元運(yùn)算符?
(1)一元加運(yùn)算?
(2)一元減運(yùn)算?
字符串連接操作符(即空格符)?
數(shù)組成員操作符(in)?
8、正則表達(dá)式操作符?
(1)匹配(~)?
不匹配(!~)?
awk正則表達(dá)式?
點(diǎn)(.)?
行開始(^)?
行結(jié)束($)?
匹配字符集([str1str2...])?
排除集([^str1str2...])?
或(|)?
最多出現(xiàn)一次(?)?
至少出現(xiàn)一次(+)?
出現(xiàn)0次或多次(*)?
分組(())?
awk數(shù)組?
創(chuàng)建數(shù)組?
刪除數(shù)組元素?
多維數(shù)組?
awk控制流(if else)?
if語句?
if-else語句?
if-else-if語句梯?
awk循環(huán)(for、while)?
For循環(huán)?
while循環(huán)?
do-while循環(huán)?
Break?
Continue?
Exit?
十二、內(nèi)置函數(shù)?
算數(shù)函數(shù)?
int(expr)?
Rand()?
sqrt(expr)?
字符串函數(shù)?
asort(arr,[, d [,how] ])?
asorti(arr,[, d [,how] ])?
gsub(regx,sub, string)?
index(str,sub)?
length(str)?
split(str, arr,regex)?
strtonum(str)?
sub(regex,sub,string)?
substr(str, start, length)?
tolower(str)?
(11)toupper(str)?
時(shí)間函數(shù)?
位操作函數(shù)?
and?
lshirt(num,step)?
rshirt(num,step)?
or?
xor?
5、其他函數(shù)?
(1)close(expr)?
(2)delete?
exit?
getline?
next?
(6)nextfile?
return?
system?
用戶自定義函數(shù)?