Linux教程課件:awk編程的使用_第1頁
Linux教程課件:awk編程的使用_第2頁
Linux教程課件:awk編程的使用_第3頁
Linux教程課件:awk編程的使用_第4頁
Linux教程課件:awk編程的使用_第5頁
已閱讀5頁,還剩27頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

awk編程的使用本章目標(biāo)1.awk編程的作用2.awk的模式3.awk的動作4.awk的運算符5.awk的內(nèi)建函數(shù)6.awk的內(nèi)建變量7.awk與正則的配合使用awk編程語言的特點1.使用直譯器(Interpreter)不需先行編譯2.變量無類型之分(Typeless)3.可使用文字當(dāng)數(shù)組的下標(biāo)(AssociativeArray)4.awk撰寫程序比起使用其它語言更簡潔便利且節(jié)省時間5.awk還具有一些內(nèi)建變量和函數(shù)6.awk擅于處理具數(shù)據(jù)行(Record),字段(Field)型態(tài)的資料7.awk內(nèi)建有pipe的功能,可以傳送到shell進(jìn)行加工處理8.awk的數(shù)據(jù)行數(shù)據(jù)行:awk從數(shù)據(jù)文件上讀取數(shù)據(jù)的基本單位.以上列文件emp.dat為例,awk讀入的第一筆數(shù)據(jù)行是"A125Jenny100210"第二筆數(shù)據(jù)行是"A341Dan110215"一般而言,一個數(shù)據(jù)行就相當(dāng)于數(shù)據(jù)文件上的一行資料awk的數(shù)據(jù)列字段(Field):為數(shù)據(jù)行上被分隔開的子字符串.以數(shù)據(jù)行"A125Jenny100210"為例,第一欄第二欄第三欄第四欄"A125""Jenny"100210一般是以空格符來分隔相鄰的字段.awk程序的主要結(jié)構(gòu)awk程序的主要結(jié)構(gòu):

awk程序中主要語法是Pattern{Actions},故常見之a(chǎn)wk程序其型態(tài)如下:Pattern1{Actions1}Pattern2{Actions2}......Pattern3{Actions3}pattern是什么?awk可接受許多不同型態(tài)的Pattern.一般常使用"關(guān)系表達(dá)式"(Relationalexpression)來當(dāng)成Pattern.例如:x>34是一個Pattern,判斷變量x與34是否存在大于的關(guān)系.x==y是一個Pattern,判斷變量x與變量y是否存在等于的關(guān)系.上式中

x>34,x==y便是典型的Pattern.awk提供C語言中常見的關(guān)系運算符(RelationalOperators)如>,<,>=,<=,==,!=此外,awk還提供

~(match)及

!~(notmatch)二個關(guān)系運算符action是什么?Actions是由許多awk指令構(gòu)成.而awk的指令與C語言中的指令十分類似.例如

:awk的I/O指令:print,printf(),getline...awk的流程控制指令:if(...){..}else{..},while(...){...}...awk如何處理Pattern{Actions}?awk會先判斷(Evaluate)該Pattern的值,若Pattern判斷后的值為true(或不為0的數(shù)字,或不是空的字符串),則awk將執(zhí)行該Pattern所對應(yīng)的Actions.反之,若Pattern之值不為true,則awk將不執(zhí)行該Pattern所對應(yīng)的Actions.特殊的patten之BEGINBEGIN為awk的保留字,是一種特殊的Pattern.BEGIN成立(其值為true)的時機是:"awk程序一開始執(zhí)行,尚未讀取任何數(shù)據(jù)之前."所以在BEGIN{Actions}語法中,其Actions部份僅于程序一開始執(zhí)行時被執(zhí)行一次.當(dāng)awk從數(shù)據(jù)文件讀入數(shù)據(jù)行后,BEGIN便不再成立,故不論有多少數(shù)據(jù)行,該Actions部份僅被執(zhí)行一次特殊的patten之ENDEND為awk的保留字,是另一種特殊的Pattern.END成立(其值為true)的時機與BEGIN恰好相反,為:"awk處理完所有數(shù)據(jù),即將離開程序時"平常讀入數(shù)據(jù)行時,END并不成立,故其對應(yīng)的Actions并不被執(zhí)行;唯有當(dāng)awk讀完所有數(shù)據(jù)時,該Actions才會被執(zhí)行注意:不管數(shù)據(jù)行有多少筆,該Actions僅被執(zhí)行一次awk的運算符awk中的數(shù)學(xué)運算符

+(加),-(減),*(乘),/(除),%(求余數(shù)),^(指數(shù))awk中的賦值運算符

=,+=,-=,*=,/=,%=,^=awk中的邏輯運算符

&&(and),||(or),!(not)awk中的關(guān)系運算符

>,>=,<,<=,==,!=,~,!~awk中其它的運算符

+(正號),-(負(fù)號),

++(遞增),--(遞減)awk的指令關(guān)鍵字print表達(dá)式列表printf(格式化字符串,表達(dá)式列表)if(表達(dá)式)語句[else語句]while(表達(dá)式)語句do語句while(表達(dá)式)for(表達(dá)式;表達(dá)式;表達(dá)式)語句for(variableinarray)語句deletebreakcontinueexit[表達(dá)式]awk中for語句的特殊用法語法:for(variablein

array)statement范例:執(zhí)行下列命令awk'BEGIN{X[1]=50;X[2]=60;X["last"]=70for(anyinX)printf("X[%s]=%d\n",any,X[any])}'結(jié)果輸出:X[last]=70X[1]=50X[2]=60awk到shell的輸出和輸入指令1.printf指令2.print指令3.getline4.close5.system6."|"pipe指令awk中printf使用printf("format",item1,item2,..)范例:id="BE-2647";

ave=89printf("ID#:%s

AveScore:%d\n",id,ave)(a)結(jié)果印出:ID#:BE-2647

AveScore:89awk中print的使用范例:id="BE-267";

ave=89print"ID#:",id,"AveScore:"ave(a)結(jié)果印出:ID#:BE-267AveScore:89awk中g(shù)etline的使用語法getline一次讀取一行資料,若讀取成功則return1,若讀取失敗則return-1,若遇到文件結(jié)束(EOF),則return0awk中close的使用范例:BEGIN{

print"ID#

Salary">"data.rpt"}

{

print$1,$2*$3

|"sort-k1>data.rpt"}

END{

close("data.rpt")

close("sort-k1>data.rpt")

print"Thereare",NR,"recordsprocessed."}awk中system的使用該指令用以執(zhí)行Shell上的command.范例:DataFile="invent.rpt"system("rm"DataFile)

說明:(a)system("字符串")指令接受一個字符串當(dāng)成Shell的命令.上例中,使用一個字串常數(shù)"rm"連接(concate)一個變量DataFile形成要求Shell執(zhí)行的命令.Shell實際執(zhí)行的命令為"rminvent.rpt"awk中pipe的使用"|"配合awk輸出指令,可把output到stdout的資料繼續(xù)轉(zhuǎn)送給Shell上的某一命令當(dāng)成input的資料."|"

配合awkgetline指令,可呼叫Shell執(zhí)行某一命令,再以awk的getline指令將該命令的所產(chǎn)生的資料讀進(jìn)awk程序中.范例:{print$1,$2*$3

|"sort-k1>result"}

"date"|

getline

Date_dataawk的內(nèi)建函數(shù)index(原字串,找尋的子字串)

length(字串)

match(原字串,用以找尋比對的正則表達(dá)式)

split(原字串,數(shù)組名稱,分隔字符)

sprintf(格式字符串,項1,項2,...)

sub(比對用的正則表達(dá)式,將替換的新字串,原字串)

gsub(比對用的正則表達(dá)式,將替換的新字串,原字串)

substr(字串,起始位置[,長度])

awk的數(shù)學(xué)函數(shù)int(x):返回x的整數(shù)部分

sqrt(x):返回x的平方根

exp(x):將返回e的x次方

log(x):將返回x以e為底的對數(shù)值

sin(x):x須以弧度為單位,sin(x)將返回x的sin函數(shù)值.cos(x):x須以弧度為單位,cos(x)將返回x的cos函數(shù)值rand():返回介于0與1之間的隨機數(shù)值;0<rand()<1

srand([x]):指定以x為rand()函數(shù)起始的種子

awk的內(nèi)建變量ARGC

記錄除了-F,-v,-f之外的所有參數(shù)的個數(shù)ARGV數(shù)組用以記錄命令列上的參數(shù)FILENAME當(dāng)前文件名FS字段分隔符RS行分隔符NF字段數(shù)NR當(dāng)前文件行數(shù)FNR已讀入行數(shù)$0awk所讀入的數(shù)據(jù)行$1,$2..讀入數(shù)據(jù)的字段數(shù)OFS輸出字段分隔符ORS輸出行分隔符RSTART與函數(shù)match()有關(guān)的函數(shù)RLENGTH與函數(shù)match()有關(guān)的函數(shù)sub與gsub搭配使用awk'BEGIN{data="p12-P34P56-p61"while(match(data,/[0-9]+/)>0){printsubstr(data,RSTART,RLENGTH)sub(/[0-9]+/,"",data)}}'結(jié)果輸出:12345661awk中數(shù)組的使用awk程序中允許使用字符串當(dāng)做數(shù)組的下標(biāo)(index).利用這個特色十分有助于資料統(tǒng)計工作.(使用字符串當(dāng)下標(biāo)的數(shù)組稱為AssociativeArray)awk中數(shù)組的特性

使用字符串當(dāng)數(shù)組的下標(biāo)(index).使用數(shù)組前不須宣告數(shù)組名及其大小awk數(shù)組舉例首先建立一個數(shù)據(jù)文件,并取名為reg.dat.此為一學(xué)生注冊的資料文件;第一欄為學(xué)生姓名,其后為該生所修課程

catreg.datMaryO.S.Arch.DiscreteSteveD.S.AlgorithmArch.WangDiscreteGraphicsO.S.LisaGraphicsA.I.LilyDiscreteAlgorithm需求的實現(xiàn)[范例:]統(tǒng)計各科修課人數(shù),并印出結(jié)果.建立如下程序,并取名為course.awk:{for(i=2;i<=NF;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論