最近接觸了linux的使用和一些命令、工具的使用,awk恐怕是linux用處最廣的工具之一了,今天開(kāi)始,我打算記錄下我的學(xué)習(xí)過(guò)程。 一.awk的簡(jiǎn)介 與sed和grep很相似,awk是一種樣式掃描與處理工具,其功能遠(yuǎn)遠(yuǎn)強(qiáng)于sed和grep,除了幾乎所有的sed和grep功能之外,awk還可以進(jìn)行樣式裝入,流控制,數(shù)學(xué)運(yùn)算符,進(jìn)程控制語(yǔ)句,甚至內(nèi)置的變量和函數(shù)。它具備了一個(gè)完整的語(yǔ)言所應(yīng)具備的特性,實(shí)際上awk確實(shí)擁有自己的語(yǔ)言,awk程序設(shè)計(jì)語(yǔ)言,awk的三位創(chuàng)建者已將其定義為:awk樣式掃描和處理語(yǔ)言。 基于文本的樣式掃描和處理是我們經(jīng)常要做的工作,比如從一個(gè)上千行的具有一定格式的文本文件中找出滿足要求的行并輸出到一個(gè)新文本,就可以使用awk。再比如,監(jiān)控網(wǎng)絡(luò)時(shí),由于網(wǎng)絡(luò)上流動(dòng)的數(shù)據(jù)非常多,如果需要獲得某些特定的數(shù)據(jù),使用awk過(guò)濾。簡(jiǎn)而言之,awk就是一個(gè)強(qiáng)大的文本處理工具。 在這里有一個(gè)可遵循的一般原則:如果你用普通的shell工具或shell script有困難的話,試試awk,如果awk仍不能解決問(wèn)題,則便用C語(yǔ)言,如果C語(yǔ)言仍然失敗,則移至C++。 二.awk的調(diào)用方式 1.awk命令行的方式,適用于解決簡(jiǎn)單問(wèn)題,例如:打印testfile文本中第一列為abc的所有行(省略了print)
2.使用-f選項(xiàng)調(diào)用awk程序文件,例如:將一段awk程序保存到文本,名為testawk1,在命令行中執(zhí)行該文件
3.利用命令解釋器調(diào)用awk,例如:將一段awk程序保存至文本,名為myawk,與前面不同的是該文本首行需要添加:#!/bin/awk -f ,保存后賦予該文件執(zhí)行權(quán)限,命令行中直接調(diào)用:
三.awk語(yǔ)法 awk [ -F re] [parameter...] ['prog'] [-f progfile][in_file...] -F re: 允許awk更改其字段分隔符。 parameter: 'prog': awk程序語(yǔ)句段,必須使用單引號(hào)‘’引起來(lái),防止被shell解釋。 其標(biāo)準(zhǔn)形式為'pattern{action}'。前面第二節(jié)中的第一小節(jié)舉例:awk '$1==abc' testfile其中'$1==abc'就是pattern,起過(guò)濾作用,即:只有符合$1==abc的行,才執(zhí)行執(zhí)行{action}操作。但此例中省略了{(lán)action},此時(shí)將默認(rèn)執(zhí)行print操作,即打印到標(biāo)準(zhǔn)輸出。 pattern和{action}二者可以省略其中之一,但是不能兩者同時(shí)省略。pattern省略時(shí)表示不對(duì)任何行進(jìn)行過(guò)濾。 {action}中的語(yǔ)句之間,使用;進(jìn)行分隔,使用#進(jìn)行注釋。 -f progfile: 允許awk調(diào)用并執(zhí)行progfile文件。progfile必須是一個(gè)符合awk語(yǔ)法的文本文件。 in_file: awk的輸入文件。awk允許對(duì)多個(gè)輸入文件進(jìn)行處理,其間用,隔開(kāi),awk不會(huì)修改輸入文件。如果未指定輸入文件,awk將接受標(biāo)準(zhǔn)輸入,并將結(jié)果顯示在標(biāo)準(zhǔn)輸出。awk支持輸入輸出重定向。 四.記錄、字段和內(nèi)置變量 記錄和字段:在awk中,缺省情況下會(huì)將文本中的一行視為一個(gè)記錄,而將一行中的某一部分視作一個(gè)字段,這與數(shù)據(jù)庫(kù)中對(duì)數(shù)據(jù)的處理方式類似。比如數(shù)據(jù)庫(kù)中某個(gè)數(shù)據(jù)表的第一個(gè)字段名叫做ID,第二個(gè)叫做Name,在awk中使用$1、$2表示第一個(gè)字段、第二個(gè)字段。特殊的,awk用$0來(lái)表示整個(gè)行(整條記錄)。 分隔符:不同的字段之間是用稱作分隔符的字符分隔開(kāi)的。系統(tǒng)默認(rèn)的分隔符是空格。awk允許在命令行中用-F re的形式來(lái)改變這個(gè)分隔符。事實(shí)上,awk用一個(gè)內(nèi)置的變量FS來(lái)記憶這個(gè)分隔符。 內(nèi)置變量:除了FS外,awk中有好幾個(gè)這樣的內(nèi)置變量,如記錄和記錄之間(行與行之間)的分隔符使用RS表示,當(dāng)前工作的記錄數(shù)為NR等等。這些內(nèi)置的變量可以在awk程序中引用或修改,例如,可以利用NR變量在模式匹配中指定工作范圍,也可以通過(guò)修改記錄分隔符RS讓一個(gè)特殊字符而不是換行符作為記錄的分隔符。例如,以下語(yǔ)句表示,顯示文本文件第7行到第15行中以%分給的第1、3、7個(gè)字段值。
awk的其他內(nèi)置變量:A=awk,N=nawk,P=POSIX awk。以下內(nèi)置變量以系統(tǒng)中的幫助為準(zhǔn)(不同系統(tǒng)下的awk可能有所出入)。
五.內(nèi)置函數(shù) 例:顯示文件myfile中的行號(hào)和第3字段: 其中,printf即內(nèi)部函數(shù),該函數(shù)類似c++中的printf,可以對(duì)輸出格式進(jìn)行控制; 例:下面的示例顯示了內(nèi)置變量和內(nèi)置函數(shù)length()的使用: 其他內(nèi)置函數(shù):(以自己系統(tǒng)中的幫助為準(zhǔn)) N gsub(reg,string,target) 每次常規(guī)表達(dá)式reg匹配時(shí)替換target中的string 六.awk的自定義變量 awk允許用戶在awk程序語(yǔ)句中定義并調(diào)用自已的變量。當(dāng)然這種變量不能與內(nèi)置變量及其它awk保留字相同。與C語(yǔ)言不同的是,awk中不需要對(duì)變量進(jìn)行初始化,awk根據(jù)其在awk中第一次出現(xiàn)的形式和上下文確定其具體的數(shù)據(jù)類型。當(dāng)變量類型不確定時(shí),awk默認(rèn)其為字符串類型。這里有一個(gè)技巧:如果你要讓你的awk程序知道你所使用的變量的明確類型,你應(yīng)當(dāng)在在程序中給它賦初值。 舉例: awk '[name=$1;pwd=$2;print $1,$2]' user.log 說(shuō)明:上例中的name、pwd均為自定義變量,不需初始化,非常簡(jiǎn)便. |
|