AWK加強的文本處理shell特徵--AWK徹底手冊

AWK這是一個很好的文字處理工具。shell

它不只 Linux 中也是不論什麼環境中現有的功能最強大的數據處理引擎之中的一個。數據庫

本文主要摘錄池中龍寫的Unixawk使用手冊(第二版),對當中內容略微修改。感謝做者的分享。編程



0做者的話

UNIXAWK使用手冊》是我幾個月前的做品了,回過頭來看,這篇文章實在是很是粗燥,因當時我寫做並上傳這個做品時實在是太忙了,沒有對文章的質量進行很是好的檢查,內心老認爲有愧於網友的厚愛。因而趁閒趕緊重寫一遍,儘管不必定會有很是大的改觀,但質量是確定要好一點的。惟如此。個人良心上纔好受一點。呶,如下就是個人改動稿,各位老友請與初版相比一下。看是否有所進步。

此次改寫仍然保留了原有的風格:正文由淺入深,文後附上了大量的相關資料,這樣作的緣由是爲了知足各類用戶的需求。這在初版中已經說過了。

此次基本的改變是在內容上,添加了很是多新內容。並添加了演示樣例。以幫助讀者理解當中的內容,附錄也補充了不少新的資料。固然讀者要真正地掌握awk,只讀了本文是不夠的。還必須有上機實習這一步。值得提醒你們的是,awk有很是多版本號。並且各個版本號之間存在着一些區別。所以,在使用awk曾經最好參考一下你使用的系統的聯機幫助。
什麼是awk?
你可能對UNIX比較熟悉,但你可能對awk很是陌生。這一點也不奇怪,的確,與其優秀的功能相比,awk還遠沒達到它應有的知名度。awk是什麼?與其餘大多數UNIX命令不一樣的是,從名字上看。咱們不可能知道awk的功能:它既不是具備獨立意義的英文單詞。也不是幾個相關單詞的縮寫。其實,awk是三個人名的縮寫。他們是:Aho(Peter)Weinberg(Brain)Kernighan。正是這三我的創造了awk---一個優秀的樣式掃描與處理工具。

AWK
的功能是什麼?與sedgrep很是類似,awk是一種樣式掃描與處理工具。但其功能卻大大強於sedgrepawk提供了極其強大的功能:它差點兒可以完畢grepsed所能完畢的全部工做。同一時候,它還可以可以進行樣式裝入、流控制、數學運算符、進程控制語句甚至於內置的變量和函數。它具有了一個完整的語言所應具備的差點兒全部精美特性。

實際上。awk的確擁有本身的語言:awk程序設計語言。awk的三位建立者已將它正式定義爲:樣式掃描和處理語言(注:這裏的樣式指pattern)
爲何使用awk?


即便如此。你或許仍然會問,我爲何要使用awk?



使用awk的第一個理由是基於文本的樣式掃描和處理是咱們經常作的工做,awk所作的工做有些象數據庫,但與數據庫不一樣的是。它處理的是文本文件,這些文件沒有專門的存儲格式。普通的人們就能編輯、閱讀、理解和處理它們。

而數據庫文件每每具備特殊的存儲格式。這使得它們必須用數據庫處理程序來處理它們。既然這樣的相似於數據庫的處理工做咱們經常會遇到,咱們就應當找處處理它們的簡便易行的方法。UNIX有很是多這方面的工具,好比sedgrepsort以及find等等。awk是當中十分優秀的一種。

使用awk的第二個理由是awk是一個簡單的工具,固然這是相對於其強大的功能來講的。

的確,UNIX有不少優秀的工具,好比UNIX自然的開發工具C語言及其延續C++就很是的優秀。但相對於它們來講。awk完畢相同的功能要方便和簡捷得多。這首先是因爲awk提供了適應多種需要的解決方式:從解決簡單問題的awk命令行到複雜而靜止的awk程序設計語言,這樣作的優勢是,你可以沒必要用複雜的方法去解決原本很是easy的問題。好比,你可以用一個命令行解決簡單的問題,而C不行,即便一個再簡單的程序,C語言也必須通過編寫、編譯的全過程。其次。awk自己是解釋運行的,這就使得awk程序沒必要通過編譯的過程,同一時候,這也使得它與shellscript程序可以很是好的契合。

最後,awk自己較C語言簡單,儘管awk吸取了C語言很是多優秀的成分。熟悉C語言會對學習awk有很是大的幫助。但awk自己不需要會使用C語言——一種功能強大但需要大量時間學習才幹掌握其技巧的開發工具。



使用awk的第三個理由是awk是一個easy得到的工具。與CC++語言不一樣,awk僅僅有一個文件(/bin/awk),而且差點兒每個版本號的UNIX都提供各自版本號的awk,你全然沒必要費心去想怎樣得到awk。但C語言卻不是這樣。儘管C語言是UNIX自然的開發工具,但這個開發工具倒是單獨發行的。換言之。你必須爲你的UNIX版本號的C語言開發工具單獨付費(固然使用D版者除外),得到並安裝它,而後你才幹夠使用它。



基於以上理由。再加上awk強大的功能,咱們有理由說,假設你要處理與文本樣式掃描相關的工做,awk應該是你的第一選擇。在這裏有一個可遵循的通常原則:假設你用普通的shell工具或shellscript有困難的話,試試awk,假設awk仍不能解決這個問題。則便用C語言,假設C語言仍然失敗,則移至C++

1awk的調用方式

前面之前說過。awk提供了適應多種需要的不一樣解決方式。它們是:

1
awk命令行

你可以象使用普通UNIX命令同樣使用awk,在命令行中你也可以使用awk程序設計語言,儘管awk支持多行的錄入。但是錄入長長的命令行並保證其正確無誤倒是一件使人頭疼的事。所以。這樣的方法通常僅僅用於解決簡單的問題。固然,你也可以在shellscript程序中引用awk命令行甚至awk程序腳本。

2
使用-f選項調用awk程序awk贊成將一段awk程序寫入一個文本文件。而後在awk命令行中用-f選項調用並運行這段程序。詳細的方法咱們將在後面的awk語法中講到。

3
利用命令解釋器調用awk序。利用UNIX支持的命令解釋器功能。咱們可以將一段awk程序寫入文本文件,而後在它的第一行加上:
#!/bin/awk-f
並賦予這個文本文件以運行的權限。這樣作以後。你就可以在命令行中用相似於如下這種方式調用並運行這段awk程序了。



$awk
腳本文本名待處理文件

2awk的語法

與其餘UNIX命令同樣,awk擁有本身的語法:

awk[ -F re] [parameter...] ['prog'] [-f progfile][in_file...]

參數說明:

1
-Fre:贊成awk更改其字段分隔符。

2)parameter:
該參數幫助爲不一樣的變量賦值。



3)'prog':awk
的程序語句段。這個語句段必須用單引號:''括起。以防被shell解釋

這個程序語句段的標準形式爲:

'pattern{action}'

當中pattern參數可以是egrep正則表達式中的不論什麼一個,它可以使用語法/re/再加上一些樣式匹配技巧構成。sed相似。你也可以使用","分開兩樣式以選擇某個範圍。關於匹配的細節。你可以參考附錄。假設仍不懂的話。找本UNIX書學學grepsed(本人是在學習sed時掌握匹配技術的)。

action參數老是被大括號包圍,它由一系統awk語句組成,各語句之間用";"分隔awk解釋它們,並在pattern給定的樣式匹配的記錄上運行其操做。shell相似,你也可以使用#」做爲凝視符,它使#」到行尾的內容成爲凝視,在解釋運行時,它們將被忽略。

你可以省略patternaction之中的一個。但不能二者同一時候省略,當省略pattern時沒有樣式匹配,表示對所有行(記錄)均運行操做。省略action時運行缺省的操做——在標準輸出上顯示。

4)-f progfile:
贊成awk調用並運行progfile指定的程序文件。progfile是一個文本文件,他必須符合awk的語法。

5)in_file:awk
的輸入文件。awk贊成對多個輸入文件進行處理。值得注意的是awk不改動輸入文件。假設未指定輸入文件。awk將接受標準輸入。並將結果顯示在標準輸出上。awk支持輸入輸出重定向。

3awk的記錄、字段與內置變量

前面說過,awk處理的工做與數據庫的處理方式有一樣之處,其一樣處之中的一個就是awk支持對記錄和字段的處理。當中對字段的處理是grepsed不能實現的,這也是awk優於兩者的緣由之中的一個。在awk中,缺省的狀況下老是將文本文件裏的一行視爲一個記錄,而將一行中的某一部分做爲記錄中的一個字段。

爲了操做這些不一樣的字段,awk借用shell的方法,用$1,$2,$3...這種方式來順序地表示行(記錄)中的不一樣字段。

特殊地awk$0表示整個行(記錄)。不一樣的字段之間是用稱做分隔符的字符分隔開的。

系統默認的分隔符是空格awk贊成在命令行中用-Fre的形式來改變這個分隔符。其實,awk用一個內置的變量FS來記憶這個分隔符

awk中有好幾個這種內置變量。好比,記錄分隔符變量RS當前工做的記錄數NR等等。本文後面的附表列出了全部的內置變量。這些內置的變量可以在awk程序中引用或改動,好比,你可以利用NR變量在模式匹配中指定工做範圍,也可以經過改動記錄分隔符RS讓一個特殊字符而不是換行符做爲記錄的分隔符。



:顯示文本文件myfile第七行到第十五行中以字符%分隔的第一字段,第三字段和第七字段:

$awk -F % 'NR==7,NR==15{printf $1 $3 $7}' myfile

4awk的內置函數

awk之因此成爲一種優秀的程序設計語言的緣由之中的一個是它吸取了某些優秀的程序設計語言(好比C)語言的不少長處。這些長處之中的一個就是內置函數的使用,awk定義並支持了一系列的內置函數。由於這些函數的使用,使得awk提供的功能更爲無缺和強大,好比,awk使用了一系列的字符串處理內置函數(這些函數看起來與C語言的字符串處理函數類似,其使用方式與C語言中的函數也相差無幾)。正是由於這些內置函數的使用,使awk處理字符串的功能更增強大。本文後面的附錄中列有通常的awk所提供的內置函數,這些內置函數或許與你的awk版本號有些出入,所以。在使用以前,最好參考一下你的系統中的聯機幫助。



做爲內置函數的一個樣例,咱們將在這裏介紹awkprintf函數,這個函數使得awkc語言的輸出相一致。實際上。awk中有不少引用形式都是從C語言借用過來的。假設你熟悉C語言。你或許會記得當中的printf函數,它提供的強大格式輸出功能之前帶咱們不少的方便。

幸運的是,咱們在awk中又和它重逢了。awkprintf差點兒與C語言中如出一轍,假設你熟悉C語言的話,你全然可以照C語言的模式使用awk中的printf。所以在這裏。咱們僅僅給出一個樣例,假設你不熟悉的話。請隨便找一本C語言的入門書翻翻。



:顯示文件myfile中的行號和第3字段:

$awk'{printf"%03d%s\n",NR,$1}' myfile

5在命令行使用awk

依照順序,咱們應當解說awk程序設計的內容了,但在解說以前,咱們將用一些樣例來對前面的知識進行回想,這些樣例都是在命令行中使用的,由此咱們可以知道在命令行中使用awk是多麼的方便。這樣作的緣由一方面是爲如下的內容做鋪墊,還有一方面是介紹一些解決簡單問題的方法。咱們全然沒有必要用複雜的方法來解決簡單的問題----既然awk提供了較爲簡單的方法的話。

例:顯示文本文件mydoc匹配(含有)字符串"sun"的所有行。



$awk'/sun/{print}' mydoc

由於顯示整個記錄(全行)是awk的缺省動做,所以可以省略action項。

$awk'/sun/' mydoc

例:如下是一個較爲複雜的匹配的演示樣例:

$awk'/[Ss]un/, /[Mm]oon/{print}'myfile

它將顯示第一個匹配Sunsun的行與第一個匹配Moonmoon的行之間的行(注意:!

)並顯示到標準輸出上。

例:如下的演示樣例顯示了內置變量和內置函數length()的使用:

$awk'length($0)>80{print NR}' myfile

該命令行將顯示文本myfile中所有超過80個字符的行號。在這裏,用$0表示整個記錄(行),同一時候,內置變量NR不使用標誌符'$'



例:做爲一個較爲實際的樣例。咱們若是要對UNIX中的用戶進行安全性檢查。方法是考察/etc下的passwd文件,檢查當中的passwd字段(第二字段)是否爲"*",如不爲"*"。則表示該用戶沒有設置password,顯示出這些username(第一字段)。咱們可以用例如如下語句實現:

#awk-F: '$2==""{printf("%s no password!\n",$1}'/etc/passwd

在這個演示樣例中。passwd文件的字段分隔符是。所以。必須用-F:來更改默認的字段分隔符。這個演示樣例中也涉及到了內置函數printf的使用。

6awk的變量

如同其餘程序設計語言同樣,awk贊成在程序語言中設置變量。其實,提供變量的功能是程序設計語言的其本要求。不提供變量的程序設計語言本人還從未見過。

awk
提供兩種變量,一種是內置變量。這前面咱們已經講過,需要着重指出的是,與後面提到的其餘變量不一樣的是。awk程序中引用內置變量不需要使用標誌符"$"(回顧一下前面講過的NR的使用)。awk提供的還有一種變量是本身定義變量awk贊成用戶在awk程序語句中定義並調用自已的變量。

固然這樣的變量不能與內置變量及其餘awk保留字一樣。awk中引用本身定義變量必須在它前面加上標誌符"$"

C語言不一樣的是,awk中不需要對變量進行初始化awk依據其在awk中第一次出現的形式和上下文肯定其詳細的數據類型。當變量類型不肯定時。awk默認其爲字符串類型

這裏有一個技巧:假設你要讓你的awk程序知道你所使用的變量的明白類型,你應當在在程序中給它賦初值。在後面的實例中。咱們將用到這一技巧。

7運算與推斷

做爲一種程序設計語言所應具備的特色之中的一個。awk支持多種運算,這些運算與C語言提供的基本一樣:如+-*/%等等,同一時候。awk也支持C語言中類++--+=-==+=-之類的功能,這給熟悉C語言的使用者編寫awk程序帶來了極大的方便。做爲對運算功能的一種擴展,awk還提供了一系列內置的運算函數(如logsqrcossin等等)和一些用於對字符串進行操做(運算)的函數(如lengthsubstr等等)。這些函數的引用大大的提升了awk的運算功能。

做爲對條件轉移指令的一部分,關係推斷是每種程序設計語言都具有的功能,awk也不例外。awk中贊成進行多種測試,如常用的==(等於)、!=(不等於)、>(大於)、<(小於)、>=(大於等於)、>=(小於等於)等等。同一時候,做爲樣式匹配,還提供了~(匹配於)和!

~(不匹配於)推斷

做爲對測試的一種擴充,awk也支持用邏輯運算符:!()&&(與)、||(或)和括號()進行多重推斷。這大大加強了awk的功能。本文的附錄中列出了awk所贊成的運算、推斷以及操做符的優先級。

8awk的流程控制

流程控制語句是不論什麼程序設計語言都不能缺乏的部分。不論什麼好的語言都有一些運行流程控制的語句。awk提供的完備的流程控制語句相似於C語言。這給咱們編程帶來了極大的方便。

8.1BEGINEND:

awk中兩個特別的表達式。BEGINEND,這二者均可用於pattern中(參考前面的awk語法),提供BEGINEND的做用是給程序賦予初始狀態和在程序結束以後運行一些掃尾的工做。不論什麼在BEGIN以後列出的操做(在{}內)將在awk開始掃描輸入以前運行,而END以後列出的操做將在掃描完全部的輸入以後運行。所以。一般使用BEGIN來顯示變量和預置(初始化)變量。使用END來輸出終於結果。

例:累計銷售文件xs中的銷售金額(若是銷售金額在記錄的第三字段):

$awk
>'BEGIN{ FS=":";print "
統計銷售金額";total=0}
>{print$3;total=total+$3;}
>END{printf "
銷售金額總計:%.2f",total}'sx
(注:>shell提供的第二提示符。如要在shell程序awk語句和awk語言中換行,則需在行尾加反斜槓\

在這裏,BEGIN預置了內部變量FS(字段分隔符)和本身定義變量total,同一時候在掃描以前顯示出輸出行頭。而END則在掃描完畢後打印出總合計。

8.2流程控制語句

awk提供了完備的流程控制語句,其使用方法與C語言相似。如下咱們一一加以說明:

8.2.1if...else語句:

格式:
if(
表達式)
語句1
else
語句2

格式中"語句1"可以是多個語句,假設你爲了方便awk推斷也方便你自已閱讀。你最好將多個語句用{}括起來。

awk分枝結構贊成嵌套,其格式爲:

if(
表達式1
{if(
表達式2
語句1
else
語句2
}
語句3
else{if(
表達式3)
語句4
else
語句5
}
語句6

固然實際操做過程當中你可能不會用到如此複雜的分枝結構,這裏僅僅是爲了給出其樣式罷了。

8.2.2while語句

格式爲:

while(
表達式)
語句

8.2.3do-while語句

格式爲:

do
{
語句
}while(
條件推斷語句)

8.2.4for語句

格式爲:

for(
初始表達式;終止條件;步長表達式)
{
語句}

awkwhiledo-whilefor語句中贊成使用break,continue語句來控制流程走向。也贊成使用exit這種語句來退出break中斷當前正在運行的循環並跳到循環外運行下一條語句。continue從當前位置跳到循環開始處運行。對於exit的運行有兩種狀況:exit語句不在END中時,不論什麼操做中的exit命令表現得如同到了文件尾,所有模式或操做運行將中止。END模式中的操做被運行。而出現在END中的exit將致使程序終止

9awk中的本身定義函數

定義和調用用戶本身的函數是差點兒每個高級語言都具備的功能,awk也不例外,但原始的awk並不提供函數功能,僅僅有在nawk或較新的awk版本號中才幹夠添加函數。

函數的使用包括兩部分:函數的定義與函數調用。

當中函數定義又包括要運行的代碼(函數自己)和從主程序代碼傳遞到該函數的暫時調用。

awk
函數的定義方法例如如下:

function
函數名(參數表){
函數體
}


gawk中贊成將function省略爲func,但其餘版本號的awk不一樣意。函數名必須是一個合法的標誌符,參數表中可以不提供參數(但在調用函數時函數名後的一對括號仍然是必不可少的)。也可以提供一個或多個參數。與C語言類似。awk參數也是經過值來傳遞的



awk中調用函數比較簡單,其方法與C語言類似,但awkC語言更爲靈活,它不運行參數有效性檢查。換句話說。在你調用函數時,可以列出比函數估計(函數定義中規定)的多或少的參數,多餘的參數會被awk所忽略。而不足的參數,awk將它們置爲缺省值0或空字符串,詳細置爲什麼值。將取決於參數的使用方式。

awk
函數有兩種返回方式:隱式返回顯式返回。當awk運行到函數的結尾時。它本身主動地返回到調用程序,這是函數是隱式返回的。假設需要在結束以前退出函數,可以明白地使用返回語句提早退出。方法是在函數中使用形如:return返回值格式的語句。

例:如下的樣例演示了函數的使用。在這個演示樣例中,定義了一個名爲print_header的函數,該函數調用了兩個參數FileNamePageNumFileName參數傳給函數當前使用的文件名稱,PageNum參數是當前頁的頁號。

這個函數的功能是打印(顯示)出當前文件的文件名稱,和當前頁的頁號。完畢這個功能後。這個函數將返回下一頁的頁號。

nawk
>'BEGIN{pageno=1;file=FILENAME
>pageno=print_header(file
pageno)#調用函數print_header
>printf("
當前頁頁號是:%d\n",pageno);
>}

>#
定義函數print_header
>functionprint_header(FileName,PageNum){
>printf("%s%d\n",FileName,PageNum);

>PageNum++;

>returnPageNUm;
>}

>}' myfile

運行這個程序將顯演示樣例如如下內容:

myfile1
當前頁頁號是:2

10awk高級輸入輸出

10.1讀取下一條記錄:

awknext語句致使awk讀取下一個記錄並完畢模式匹配。而後立刻運行對應的操做。一般它用匹配的模式運行操做中的代碼。next致使這個記錄的不論什麼額外匹配模式被忽略。

10.2簡單地讀取一條記錄

awkgetline語句用於簡單地讀取一條記錄。假設用戶有一個數據記錄相似兩個物理記錄,那麼getline將尤事實上用。它完畢通常字段的分離(設置字段變量$0FNR NFNR)。假設成功則返回1。失敗則返回0(到達文件尾)。假設需簡單地讀取一個文件,則可以編寫下面代碼:

例:演示樣例getline的使用

{while(getline==1)
{
#processthe inputted fields
}
}

也可以使getline保存輸入數據在一個字段中,而不是經過使用getlinevariable的形式處理通常字段。當使用這樣的方式時,NF被置成0FNRNR被增值。

用戶也可以使用getline<"filename"方式從一個給定的文件裏輸入數據,而不是從命令行所列內容輸入數據。此時。getline將完畢通常字段分離(設置字段變量$0NF)。假設文件不存在。返回-1,成功,返回1,返回0表示失敗。用戶可以從給定文件裏讀取數據到一個變量中,也可以stdin(標準輸入設備)或一個包括這個文件名稱的變量取代filename。值得注意的是當使用這樣的方式時不改動FNRNR

還有一種使用getline語句的方法是UNIX命令接受輸入,好比如下的樣例:

例:演示樣例從UNIX命令接受輸入

{while("who-u"|getline)
{
#process each line fromthe who command
}
}

固然,也可以使用例如如下形式:

"command"| getline variable

10.3關閉文件:

awk中贊成在程序中關閉一個輸入或輸出文件。方法是使用awkclose語句。



close("filename")

filename
可以是getline打開的文件(也可以是stdin,包括文件名稱的變量或者getline使用的確切命令)。

或一個輸出文件(可以是stdout。包括文件名稱的變量或使用管道的確切命令)。

10.4輸出到一個文件:

awk中贊成用例如如下方式將結果輸出到一個文件:

printf("helloword!\n")>"datafile"

printf("helloword!\n")>>"datafile"


10.5輸出到一個命令

awk中贊成用例如如下方式將結果輸出到一個命令:

printf("helloword!\n")|"sort-t','"

10awkshellscript混合編程

因爲awk可以做爲一個shell命令使用,所以awk能與shell批處理程序很是好的融合在一塊兒,這給實現awkshell程序的混合編程提供了可能。

實現混合編程的關鍵是awkshellscript之間的對話。換言之,就是awkshellscript之間的信息交流:awkshellscript中獲取所需的信息(通常是變量的值)、在awk中運行shell命令行、shellscript將命令運行的結果送給awk處理以及shellscript讀取awk的運行結果等等。

10.1awk讀取Shellscript程序變量

awk中咱們可以經過'$變量名'」的方式讀取shellscrpit程序中的變量

例:在如下的演示樣例中,咱們將讀取sellscrpit程序中的變量Name,該變量存放的是文本myfile的撰寫者,awk將打印出這我的名。

$catwritename
# !/bin/sh
Name="
張三"

awk'BEGIN {name="'$Name'";\

printf("\t%s\t撰寫者%s\n",FILENAME,name");}\
{...}END{...}' myfile

10.2shell命令的運行結果送給awk處理

做爲信息傳送的一種方法。咱們可以將一條shell命令的結果經過管道線(|)傳遞給awk處理:

例:演示樣例awk處理shell命令的運行結果

$who-u | awk '{printf("%s
正在運行%s\n",$2,$1)}'

該命令將打印出註冊終端正在運行的程序名。



10.3shell script程序讀awk的運行結果

爲了實現shellscript程序讀取awk運行的結果,咱們可以採取一些特殊的方法,好比咱們可以用變量名=`awk語句`的形式將awk運行的結果存放入一個shellscript變量。固然也可以用管道線的方法將awk運行結果傳遞給shellscript程序處理。

例:做爲傳送消息的機制之中的一個,UNIX提供了一個向其所有用戶傳送消息的命令wall(意思是writetoall寫給所有用戶),該命令贊成向所有工做中的用戶(終端)發送消息。爲此,咱們可以經過一段shell批處理程序wall.shell來模擬這一程序(其實比較老的版本號中wall就是一段shell批處理程序:

$catwall.shell
#!/bin/sh
who -u | awk '{print $2}' |while read tty
do
cat /tmp/$$>$tty
#$$
的做用是產生隨機的數字?

!!
done

在這個程序裏。awk接受who-u命令的運行結果,該命令打印出所有已註冊終端的信息,當中第二個字段是已註冊終端的設備名,所以用awk命令析出該設備名。而後用whileread tty語句循環讀出這些文件名稱到變量(shellscript變量)tty中。做爲信息傳送的終結地址。

10.4awk中運行shell命令行----嵌入函數system()

system()是一個不適合字符或數字類型的嵌入函數,該函數的功能是處理做爲參數傳遞給它的字符串。system對這個參數的處理就是將其做爲命令處理,也就是說將其看成命令行同樣加以運行。

這使得用戶在本身的awk程序需要時可以靈活地運行命令或腳本。

例:如下的程序將使用system嵌入函數打印用戶編制好的報表文件,這個文件存放在名爲myreport.txt的文件裏。爲簡約起見,咱們僅僅列出了其END部分:

.
.
.
END{close("myreport.txt");system("lpmyreport.txt");}

在這個演示樣例中,咱們首先使用close語句關閉了文件myreport.txt文件。而後使用system嵌入函數將myreport.txt送入打印機打印。

寫到這裏,我不得不跟朋友們說再見了,實在地說,這些內容仍然是awk的初步知識,電腦永遠是前進的科學。awk也不例外。本篇所能作的僅僅是在你前行的漫漫長途中鋪平一段小小開端。剩下的路還得靠你本身去走。

老實說,假設本文真能給你前行的路上帶來些許的方便,那本人就滿足了!

如對本篇有不論什麼疑問,請E-mailTo:Chizlong@yeah.net或到主頁http://chizling.yeah.net中留言。

附錄

1awk的常規表達式元字符


\
換碼序列
^
在字符串的開頭開始匹配
$
在字符串的結尾開始匹配
.
與不論什麼單個字符串匹配
[ABC]
[]內的任一字符匹配
[A-Ca-c]
A-Ca-c範圍內的字符匹配(按字母表順序)
[^ABC]
與除[]內的所有字符之外的任一字符匹配
Desk|Chair
DeskChair中的任一個匹配
[ABC][DEF]
關聯。與ABC中的任一字符匹配。且其後要跟DEF中的任一個字符。
*
ABC中任一個出現0次或屢次的字符相匹配
+
ABC中不論什麼一個出現1次或屢次的字符相匹配
與一個空串或ABC在不論什麼一個字符相匹配
(Blue|Black)berry
合併常規表達式,與BlueberryBlackberry相匹配

2awk算術運算符

運算符用途
------------------
x^yx
y次冪
x**y
同上
x%y
計算x/y的餘數(求模)
x+yx
y
x-yx
y
x*yx
y
x/yx
y
-y
y(y的開關符號);也稱一目減
++yy
1後使用y(前置加)
y++
使用y值後加1(後綴加)
--yy
1後使用y(前置減)
y--
使用後y1(後綴減)
x=y
y的值賦給x
x+=y
x+y的值賦給x
x-=y
x-y的值賦給x
x*=y
x*y的值賦給x
x/=y
x/y的值賦給xx%=y x%y的值賦給x
x^=y
x^y的值賦給x
x**=y
x**y的值賦給x

3awk贊成的測試

操做符含義

x==yx
等於y
x!=yx
不等於y
x>yx
大於y
x>=yx
大於或等於y
x<yx
小於y
x<=yx
小於或等於y?
x~rex
匹配正則表達式re?
x!~rex
不匹配正則表達式re?

4awk的操做符(按優先級升序排列)

=+=-=*= /= %=
||
&&
>>= < <= == != ~ !~
xy (
字符串連結,'x''y'變成"xy"
+-
* / %
++ --

5awk內置變量(提早定義變量)


說明:表中v項表示第一個支持變量的工具(下同):A=awkN=nawk,P=POSIXawk,G=gawk

變量含義缺省值
--------------------------------------------------------
ARGC
命令行參數個數
ARGIND
當前被處理文件的ARGV標誌符
ARGV
命令行參數數組
CONVFMT
數字轉換格式%.6g
ENVIRONUNIX
環境變量
ERRNOUNIX
系統錯誤消息
FIELDWIDTHS
輸入字段寬度的空白分隔字符串
FILENAME
當前輸入文件的名字
FNR
當前記錄數
FS
輸入字段分隔符空格
IGNORECASE
控制大寫和小寫敏感0(大寫和小寫敏感)
NF
當前記錄中的字段個數
NR
已經讀出的記錄數
OFMT
數字的輸出格式%.6g
OFS
輸出字段分隔符空格
ORS
輸出的記錄分隔符新行
RS
輸入的記錄他隔符新行
RSTART
被匹配函數匹配的字符串首
RLENGTH
被匹配函數匹配的字符串長度
SUBSEP
下標分隔符"\034"

6awk的內置函數

函數用途或返回值
------------------------------------------------
gsub(reg,string,target)
每次常規表達式reg匹配時替換target中的string
index(search,string)
返回stringsearch串的位置
length(string)
求串string中的字符個數
match(string,reg)
返回常規表達式reg匹配的string中的位置
printf(format,variable)
格式化輸出,按format提供的格式輸出變量variable


split(string,store,delim)
依據分界符delim,分解stringstore的數組元素
sprintf(format,variable)
返回一個包括基於format的格式化數據。variables是要放到串中的數據
strftime(format,timestamp)
返回一個基於format的日期或者時間串。timestmpsystime()函數返回的時間
sub(reg,string,target)
第一次當常規表達式reg匹配,替換target串中的字符串
substr(string,position,len)
返回一個以position開始len個字符的子串
tolower(string)
返回string中相應的小寫字符
toupper(string)
返回string中相應的大寫字符
atan(x,y)x
的餘切(弧度)
cos(x)x
的餘弦(弧度)
exp(x)e
x
int(x)x
的整數部分
log(x)x
的天然對數值
rand()0-1
之間的隨機數
sin(x)x
的正弦(弧度)
sqrt(x)x
的平方根
srand(x)
初始化隨機數發生器。假設忽略x,則使用system()
system()
返回自197011日以來通過的時間(按秒計算)

參考資料

1、《精通UNIX》(《UnderstandingUNIX[]StanKelly-Bootle 李永峯等譯電子工業出版社)
2
、《unix使用指南》(第2版)UsingUNIXSecondEditionSteveMoritsugu等原著張擁軍、韓柯、原小玲等譯電子工業出版社出版、發行)
3
unix聯機手冊:scoOpenSrever 5.05.
4
、感謝無名的網路資源提供者,由於大家辛勤而無私的勞動,INTERNET只是如此美妙!

相關文章
相關標籤/搜索