天天觀天下!Awk教程?

2022-12-13 15:09:05 來源:51CTO博客

Awk教程?

一、awk 簡介?

awk是一種解釋執(zhí)行的編程語言,專門用來處理文本數(shù)據(jù)的。?

二、awk工作流程:?

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)?

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é)束塊也是可選的。?

示例1:?

題目:有一個(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命令行模式:?

一般情況下,我們使用awk命令行模式比較多,即直接使用awk命令處理文本數(shù)據(jù);?

Awk命令行格式如下:?

awk [options] ‘{awk-commands}’ file?

Awk程序文件:?

當(dāng)然,除了直接使用awk命令來處理文本之外,我們還可以將awk命令寫成腳本來執(zhí)行,即awk程序文件。?

Awk程序文件執(zhí)行格式如下:?

awk [options] -f file?

Awk標(biāo)準(zhǔn)選項(xiàng):?

常用的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é)果如下:?

awk基本示例?

我們以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ì)算匹配次數(shù)并輸出:?

例如:計(jì)算姓名以w開頭的行的個(gè)數(shù),用awk實(shí)現(xiàn)??

命令:?

或?

awk -F" " "/w/{++count} END {printf "count is: %d\n",count}" a.txt ?

執(zhí)行結(jié)果如下:?

輸出字符數(shù)多于33的行:?

例如:打印輸出字符串個(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)置變量?

Awk提供了一些內(nèi)置變量,在寫腳本或?qū)嶋H運(yùn)用中起到很重要的作用。?

1、標(biāo)準(zhǔn)awk變量:?

(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?

$0表示輸入的整個(gè)輸入記錄;?

(15)$n?

$n表示當(dāng)前輸入記錄的第n個(gè)域,這些域之間由FS分隔,n的取值為1,2,3......;?

awk特定變量(即專有變量)?

(1)ARGIND?

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?

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?

IGNORECASE表示忽略大小寫;?

例如:找出a.txt文件中name=wangbin這一行;使用awk這一行?

首先不開啟,即IGNORECASE=0的情況(區(qū)分大小寫):?

執(zhí)行結(jié)果如下:?

開啟IGNORECASE,即IGNORECASE=1的情況(忽略大小寫):?

執(zhí)行結(jié)果如下:?

TEXTDOMAIN?

TEXTDOMAIN表示awk程序當(dāng)前文本域,它主要是來尋找程序中字符串的本地翻譯,用于程序的國際化;默認(rèn)值是messages;?

例如:?

執(zhí)行結(jié)果如下:?

awk操作符?

算數(shù)運(yùn)算符?

加法(+)?

例子: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除法可以保留精度】?

例子:awk "BEGIN{a=5;b=3;printf "a / b = %d\n",a/b}" 【結(jié)果只保留整數(shù)】?

【結(jié)果保留3位精度】?

或者?

【默認(rèn)print輸出保留5位精度】?

執(zhí)行結(jié)果如下:?

(5)模運(yùn)算符(%)【即取余運(yùn)算】?

例子: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é)果如下:?

遞增運(yùn)算符之前置遞增運(yùn)算(如++a)?

例子: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】?

遞增運(yùn)算符之后置遞增運(yùn)算(如a++)?

例子: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】?

遞減運(yùn)算符之前置遞減運(yùn)算(如--a)?

例子: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】?

遞減運(yùn)算符之后置遞減運(yùn)算(如a--)?

例子: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】?

賦值運(yùn)算符?

簡單賦值(=)?

例子: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】?

模運(yùn)算賦值(%=)?

例子:awk "BEGIN{cnt=90;cnt%=13;print "cnt =",cnt}" ?

執(zhí)行結(jié)果如下:?

【注:首先給cnt變量賦值為90,再使用模運(yùn)算賦值將cnt除以13取余數(shù);cnt%=13等價(jià)于cnt=cnt%13】?

指數(shù)賦值^=?

例子:awk "BEGIN{cnt=3;cnt^=3;print "cnt =",cnt}"?

執(zhí)行結(jié)果:?

【注:首先給cnt變量賦值為3,再使用指數(shù)賦值計(jì)算cnt的次冪;cnt^=3等價(jià)于cnt=cnt^3】?

2、關(guān)系運(yùn)算符?

等于(==)?

例子: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é)果如下:?

邏輯運(yùn)算符?

邏輯與(&&)?

語法: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é)果如下:?

(3)邏輯非(!)?

語法:!expr1?

解釋說明:邏輯非將expr1的值取反,如果expr1為真,則返回0,否則返回1;?

例子:?

執(zhí)行結(jié)果如下:?

【注:length(name)是用來判斷name變量是否為空,不為空為真(0),為空為假(1)】?

三元運(yùn)算符?

語法: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)算符?

(1)一元加運(yùn)算?

一元加運(yùn)算符表示為+,它將操作數(shù)乘以+1;?

例子:?

執(zhí)行結(jié)果如下:?

【注:首先給a變量賦值-10,a=+a表示a=a*1,最終結(jié)果為-10】?

(2)一元減運(yùn)算?

一元減運(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ù)組成員操作符為in,該操作符用于訪問數(shù)組元素。?

例子:?

執(zhí)行結(jié)果如下:?

【注:這個(gè)例子中i代表a數(shù)組中的元素的下標(biāo),打印輸出數(shù)組中所有元素】?

8、正則表達(dá)式操作符?

(1)匹配(~)?

匹配操作符是~,它用于搜索包含匹配模式字符串的域;?

例如:打印輸出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é)果如下:?

awk正則表達(dá)式?

點(diǎn)(.)?

點(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é)束符($)匹配一行的結(jié)束;?

例如:echo -e "ww\nw\$wl\nfds\n\$\$\$\nxxxw" | awk "/w$/"?

執(zhí)行結(jié)果如下:?

匹配字符集([str1str2...])?

匹配字符集用于匹配集合(由方括號表示)中的一個(gè)字符;?

例如:echo -e "ww\nw\$wl\nfds\n\$\$\$\nxxxw" | awk "/^[w$]./" 【匹配行開始為w或$的行】?

執(zhí)行結(jié)果如下:?

排除集([^str1str2...])?

正則匹配時(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)或者出現(xiàn)一次;【?前面的字符作為參考字符,不算在初始內(nèi)容內(nèi)】?

例子:echo -e "cax\ncatx\ncattx" | awk "/cat?x/"?

執(zhí)行結(jié)果如下:?

【注:上述例子表示打印輸出匹配前面的t 0次或1次的行】?

【注:參考字符為t,得出的結(jié)果分別匹配t:0次、1次】?

至少出現(xiàn)一次(+)?

+表示匹配前面的字符至少一次;?

例子:echo -e "cax\ncatx\ncattx" | awk "/cat+x/"?

執(zhí)行結(jié)果如下:?

【注:參考字符為t,得出的結(jié)果分別匹配t:1次、2次】?

出現(xiàn)0次或多次(*)?

*表示匹配前面的字符任意個(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數(shù)組?

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)建數(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ù)組元素?

刪除數(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é)果如下:?

多維數(shù)組?

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é)果如下:?

awk控制流(if else)?

與其實(shí)的編程語言一樣,AWK 同樣提供了條件語句控制程序的執(zhí)行流程;?

if語句?

條件語句測試條件然后根據(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語句?

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é)果如下:?

if-else-if語句梯?

使用多個(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)(for、while)?

除了前面介紹的條件語句,AWK 還提供了循環(huán)語句。該語句的作用就是當(dāng)條件為真時(shí)重復(fù)執(zhí)行一系列的命令。?

For循環(huán)?

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)?

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)?

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?

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?

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?

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()中定義的退出碼】?

十二、內(nèi)置函數(shù)?

AWK 為程序開發(fā)者提供了豐富的內(nèi)置函數(shù)。這一章節(jié)會(huì)講解 AWK 提供的算術(shù)函數(shù)、字符串操作函數(shù)、時(shí)間操作相關(guān)的函數(shù)、位操作函數(shù)以及其它各種各樣的函數(shù)。?

算數(shù)函數(shù)?

int(expr)?

此函數(shù)返回?cái)?shù)值;?

例子:awk "BEGIN{a=100.24567;result=int(a);printf "a = %0.5f\nresult = %s\n" ,a,result}"?

執(zhí)行結(jié)果如下:?

Rand()?

Rand()函數(shù)返回一個(gè)大于等于;?

例子:?

執(zhí)行結(jié)果如下:?

sqrt(expr)?

此函數(shù)計(jì)算;?

例子:awk "BEGIN{a=256;printf "sqrt(%f) = %f\n",a,sqrt(a)}"?

執(zhí)行結(jié)果如下:?

字符串函數(shù)?

asort(arr,[, d [,how] ])?

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(arr,[, d [,how] ])?

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(regx,sub, string)?

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(str,sub)?

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(str)?

length 函數(shù)返回字符串的長度;?

例子:awk "BEGIN{a="abcdref ed";print "length(a) = " length(a)}"?

執(zhí)行結(jié)果:?

split(str, arr,regex)?

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)?

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(regex,sub,string)?

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(str, start, length)?

substr 函數(shù)返回 str 字符串中從第 start 個(gè)字符開始長度為 length的子串。如果沒有指定length的值,返回?

例子:awk "BEGIN{a="hello world!";b=substr(a,1,5);print b}"?

執(zhí)行結(jié)果如下:?

【注:返回a字符串中從第一個(gè)字符開始,長度為5的所有字符】?

tolower(str)?

此函數(shù)將字符串?

例子:awk "BEGIN{a="THIS IS MY NAME!";print tolower(a)}"?

執(zhí)行結(jié)果如下:?

(11)toupper(str)?

此函數(shù)將字符串?

例子:awk "BEGIN{a="this is my name!";print toupper(a)}"?

執(zhí)行結(jié)果如下:?

時(shí)間函數(shù)?

systime?

mktime(dataspec)?

strftime([format [, timestamp[, utc-flag]]])?

位操作函數(shù)?

and?

執(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】?

lshirt(num,step)?

左移位操作;?

例子: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】?

rshirt(num,step)?

右移位操作;?

例子: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)?】?

or?

按位或操作【即兩個(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】?

xor?

按位異或運(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】?

5、其他函數(shù)?

1close(expr)?

關(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)容,最后?

(2)delete?

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é)果如下:?

exit?

該函數(shù)終止腳本執(zhí)行。它可以接受可選的參數(shù);?

例子:?

【注:exit語句執(zhí)行完畢后,直接退出程序,不執(zhí)行print操作】?

getline?

getline 函數(shù)讀入下一行;?

例子:?

執(zhí)行結(jié)果如下:?

腳本看似工作正常,但是第一行去哪兒了呢?讓我們理一下整個(gè)過程。剛啟動(dòng)時(shí),AWK 從文件 marks.txt 中讀入一行存儲到變量 $0 中。在下一條語句中,我們使用 getline 讀入下一行。 因此 AWK 讀入第二行并存儲到 $0中。最后,AWK 使用 print 輸出第二行的內(nèi)容。這個(gè)過程一直到文件結(jié)束。?

next?

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)入下一條記錄的處理過程】?

(6)nextfile?

nextfile 停止處理當(dāng)前文件,從下一個(gè)文件第一個(gè)記錄開始處理。?

return?

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?

system 函數(shù)可以執(zhí)行特定的命令然后返回其退出狀態(tài)。返回值為 0 表示命令執(zhí)行成功;非 0 表示命令執(zhí)行失敗。?

例子:awk "BEGIN { ret = system("ifconfig eth0"); print "Return value = " ret }"?

執(zhí)行結(jié)果如下:?

用戶自定義函數(shù)?

函數(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ù)與之對比】?

標(biāo)簽: 打印輸出 變量賦值 輸入記錄

上一篇:Java8實(shí)戰(zhàn)之Stream
下一篇:要聞速遞:QT實(shí)現(xiàn)動(dòng)態(tài)曲線