什麼是awk? 你可能對UNIX比較熟悉,但你可能對awk很陌生,這一點也不奇怪,的確,與其優秀的功能相比,awk還遠沒達到它應有的知名度。awk是什 麼?與其它大多數UNIX命令不一樣的是,從名字上看,咱們不可能知道awk的功能:它既不是具備獨立意義的英文單詞,也不是幾個相關單詞的縮寫。事實 上,awk是三我的名的縮寫,他們是:Aho、(Peter)Weinberg和(Brain)Kernighan。正是這三我的創造了awk---一個 優秀的樣式掃描與處理工具。 AWK的功能是什麼?與sed和grep很類似,awk是一種樣式掃描與處理工具。但其功能卻大大強於sed和grep。awk提供了極其強大的 功能:它幾乎能夠完成grep和sed所能完成的所有工做,同時,它還能夠能夠進行樣式裝入、流控制、數學運算符、進程控制語句甚至於內置的變量和函數。 它具有了一個完整的語言所應具備的幾乎全部精美特性。實際上,awk的確擁有本身的語言:awk程序設計語言,awk的三位建立者已將它正式定義爲:樣式 掃描和處理語言。 爲何使用awk? 即便如此,你也許仍然會問,我爲何要使用awk? 使用awk的第一個理由是基於文本的樣式掃描和處理是咱們常常作的工做,awk所作的工做有些象數據庫,但與數據庫不一樣的是,它處理的是文本文 件,這些文件沒有專門的存儲格式,普通的人們就能編輯、閱讀、理解和處理它們。而數據庫文件每每具備特殊的存儲格式,這使得它們必須用數據庫處理程序來處 理它們。既然這種相似於數據庫的處理工做咱們常常會遇到,咱們就應當找處處理它們的簡便易行的方法,UNIX有不少這方面的工具,例如sed 、grep、sort以及find等等,awk是其中十分優秀的一種。 使用awk的第二個理由是awk是一個簡單的工具,固然這是相對於其強大的功能來講的。的確,UNIX有許多優秀的工具,例如UNIX自然的開發 工具C語言及其延續C++就很是的優秀。但相對於它們來講,awk完成一樣的功能要方便和簡捷得多。這首先是由於awk提供了適應多種須要的解決方案:從 解決簡單問題的awk命令行到複雜而精巧的awk程序設計語言,這樣作的好處是,你能夠沒必要用複雜的方法去解決原本很簡單的問題。例如,你能夠用一個命令 行解決簡單的問題,而C不行,即便一個再簡單的程序,C語言也必須通過編寫、編譯的全過程。其次,awk自己是解釋執行的,這就使得awk程序沒必要通過編 譯的過程,同時,這也使得它與shell script程序可以很好的契合。最後,awk自己較C語言簡單,雖然awk吸取了C語言不少優秀的成分,熟悉C語言會對學習awk有很大的幫助,但 awk自己不需要會使用C語言――一種功能強大但須要大量時間學習才能掌握其技巧的開發工具。 使用awk的第三個理由是awk是一個容易得到的工具。與C和C++語言不一樣,awk只有一個文件(/bin/awk),並且幾乎每一個版本的 UNIX都提供各自版本的awk,你徹底沒必要費心去想如何得到awk。但C語言卻不是這樣,雖然C語言是UNIX自然的開發工具,但這個開發工具倒是單獨 發行的,換言之,你必須爲你的UNIX版本的C語言開發工具單獨付費(固然使用D版者除外),得到並安裝它,而後你纔可使用它。 基於以上理由,再加上awk強大的功能,咱們有理由說,若是你要處理與文本樣式掃描相關的工做,awk應該是你的第一選擇。在這裏有一個可遵循的 通常原則:若是你用普通的shell工具或shell script有困難的話,試試awk,若是awk仍不能解決問題,則便用C語言,若是C語言仍然失敗,則移至C++。 awk的調用方式 前面曾經說過,awk提供了適應多種須要的不一樣解決方案,它們是: 1、awk命令行,你能夠象使用普通UNIX命令同樣使用awk,在命令行中你也可使用awk程序設計語言,雖然awk支持多行的錄入,可是錄 入長長的命令行並保證其正確無誤倒是一件使人頭疼的事,所以,這種方法通常只用於解決簡單的問題。固然,你也能夠在shell script程序中引用awk命令行甚至awk程序腳本。 2、使用-f選項調用awk程序。awk容許將一段awk程序寫入一個文本文件,而後在awk命令行中用-f選項調用並執行這段程序。具體的方法咱們將在後面的awk語法中講到。 3、利用命令解釋器調用awk程序:利用UNIX支持的命令解釋器功能,咱們能夠將一段awk程序寫入文本文件,而後在它的第一行加上: #!/bin/awk -f 並賦予這個文本文件以執行的權限。這樣作以後,你就能夠在命令行中用相似於下面這樣的方式調用並執行這段awk程序了。 $awk腳本文本名 待處理文件 awk的語法: 與其它UNIX命令同樣,awk擁有本身的語法: awk [ -F re] [parameter...] ['prog'] [-f progfile][in_file...] 參數說明: -F re:容許awk更改其字段分隔符。 parameter: 該參數幫助爲不一樣的變量賦值。 'prog': awk的程序語句段。這個語句段必須用單拓號:'和'括起,以防被shell解釋。這個程序語句段的標準形式爲: 'pattern {action}' 其中pattern參數能夠是egrep正則表達式中的任何一個,它可使用語法/re/再加上一些樣式匹配技巧構成。與sed相似,你也可使 用","分開兩樣式以選擇某個範圍。關於匹配的細節,你能夠參考附錄,若是仍不懂的話,找本UNIX書學學grep和sed(本人是在學習ed時掌握匹配 技術的)。action參數老是被大括號包圍,它由一系統awk語句組成,各語句之間用";"分隔。awk解釋它們,並在pattern給定的樣式匹配的 記錄上執行其操做。與shell相似,你也可使用「#」做爲註釋符,它使「#」到行尾的內容成爲註釋,在解釋執行時,它們將被忽略。你能夠省略 pattern和action之一,但不能二者同時省略,當省略pattern時沒有樣式匹配,表示對全部行(記錄)均執行操做,省略action時執行 缺省的操做――在標準輸出上顯示。 -f progfile:容許awk調用並執行progfile指定有程序文件。progfile是一個文本文件,他必須符合awk的語法。 in_file:awk的輸入文件,awk容許對多個輸入文件進行處理。值得注意的是awk不修改輸入文件。若是未指定輸入文件,awk將接受標準輸入,並將結果顯示在標準輸出上。awk支持輸入輸出重定向。 awk的記錄、字段與內置變量: 前面說過,awk處理的工做與數據庫的處理方式有相同之處,其相同處之一就是awk支持對記錄和字段的處理,其中對字段的處理是grep和sed 不能實現的,這也是awk優於兩者的緣由之一。在awk中,缺省的狀況下老是將文本文件中的一行視爲一個記錄,而將一行中的某一部分做爲記錄中的一個字 段。爲了操做這些不一樣的字段,awk借用shell的方法,用$1,$2,$3...這樣的方式來順序地表示行(記錄)中的不一樣字段。特殊地,awk 用$0表示整個行(記錄)。不一樣的字段之間是用稱做分隔符的字符分隔開的。系統默認的分隔符是空格。awk容許在命令行中用-F re的形式來改變這個分隔符。事實上,awk用一個內置的變量FS來記憶這個分隔符。awk中有好幾個這樣的內置變量,例如,記錄分隔符變量RS、當前工 做的記錄數NR等等,本文後面的附表列出了所有的內置變量。這些內置的變量能夠在awk程序中引用或修改,例如,你能夠利用NR變量在模式匹配中指定工做 範圍,也能夠經過修改記錄分隔符RS讓一個特殊字符而不是換行符做爲記錄的分隔符。 例:顯示文本文件myfile中第七行到第十五行中以字符%分隔的第一字段,第三字段和第七字段: awk -F % 'NR==7,NR==15 {printf $1 $3 $7}' awk的內置函數 awk之因此成爲一種優秀的程序設計語言的緣由之一是它吸取了某些優秀的程序設計語言(例如C)語言的許多優勢。這些優勢之一就是內置函數的使 用,awk定義並支持了一系列的內置函數,因爲這些函數的使用,使得awk提供的功能更爲完善和強大,例如,awk使用了一系列的字符串處理內置函數(這 些函數看起來與C語言的字符串處理函數類似,其使用方式與C語言中的函數也相差無幾),正是因爲這些內置函數的使用,使awk處理字符串的功能更增強大。 本文後面的附錄中列有通常的awk所提供的內置函數,這些內置函數也許與你的awk版本有些出入,所以,在使用以前,最好參考一下你的系統中的聯機幫助。 做爲內置函數的一個例子,咱們將在這裏介紹awk的printf函數,這個函數使得awk與c語言的輸出相一致。實際上,awk中有許多引用形式 都是從C語言借用過來的。若是你熟悉C語言,你也許會記得其中的printf函數,它提供的強大格式輸出功能曾經帶咱們許多的方便。幸運的是,咱們在 awk中又和它重逢了。awk中printf幾乎與C語言中如出一轍,若是你熟悉C語言的話,你徹底能夠照C語言的模式使用awk中的printf。所以 在這裏,咱們只給出一個例子,若是你不熟悉的話,請隨便找一本C語言的入門書翻翻。 例:顯示文件myfile中的行號和第3字段: $awk '{printf"%03d%s",NR,$1}' myfile 在命令行使用awk 按照順序,咱們應當講解awk程序設計的內容了,但在講解以前,咱們將用一些例子來對前面的知識進行回顧,這些例子都是在命令行中使用的,由此我 們能夠知道在命令行中使用awk是多麼的方便。這樣作的緣由一方面是爲下面的內容做鋪墊,另外一方面是介紹一些解決簡單問題的方法,咱們徹底沒有必要用複雜 的方法來解決簡單的問題----既然awk提供了較爲簡單的方法的話。 例:顯示文本文件mydoc匹配(含有)字符串"sun"的全部行。 $awk '/sun/{print}' mydoc 因爲顯示整個記錄(全行)是awk的缺省動做,所以能夠省略action項。 $awk '/sun/' mydoc 例:下面是一個較爲複雜的匹配的示例: $awk '/[Ss]un/,/[Mm]oon/ {print}' myfile 它將顯示第一個匹配Sun或sun的行與第一個匹配Moon或moon的行之間的行,並顯示到標準輸出上。 例:下面的示例顯示了內置變量和內置函數length()的使用: $awk 'length($0)>80 {print NR}' myfile 該命令行將顯示文本myfile中全部超過80個字符的行號,在這裏,用$0表示整個記錄(行),同時,內置變量NR不使用標誌符'$'。 例:做爲一個較爲實際的例子,咱們假設要對UNIX中的用戶進行安全性檢查,方法是考察/etc下的passwd文件,檢查其中的passwd字 段(第二字段)是否爲"*",如不爲"*",則表示該用戶沒有設置密碼,顯示出這些用戶名(第一字段)。咱們能夠用以下語句實現: #awk -F: '$2=="" {printf("%s no password!",$1' /etc/passwd 在這個示例中,passwd文件的字段分隔符是「:」,所以,必須用-F:來更改默認的字段分隔符,這個示例中也涉及到了內置函數printf的使用。 awk的變量 如同其它程序設計語言同樣,awk容許在程序語言中設置變量,事實上,提供變量的功能是程序設計語言的其本要求,不提供變量的程序設計語言本人還從未見過。 awk提供兩種變量,一種是awk內置的變量,這前面咱們已經講過,須要着重指出的是,與後面提到的其它變量不一樣的是,在awk程序中引用內置變 量不須要使用標誌符"$"(回憶一下前面講過的NR的使用)。awk提供的另外一種變量是自定義變量。awk容許用戶在awk程序語句中定義並調用自已的變 量。固然這種變量不能與內置變量及其它awk保留字相同,在awk中引用自定義變量必須在它前面加上標誌符"$"。與C語言不一樣的是,awk中不須要對變 量進行初始化,awk根據其在awk中第一次出現的形式和上下文肯定其具體的數據類型。當變量類型不肯定時,awk默認其爲字符串類型。這裏有一個技巧: 若是你要讓你的awk程序知道你所使用的變量的明確類型,你應當在在程序中給它賦初值。在後面的實例中,咱們將用到這一技巧。 運算與判斷: 做爲一種程序設計語言所應具備的特色之一,awk支持多種運算,這些運算與C語言提供的幾本相同:如+、-、*、/、%等等,同時,awk也支持 C語言中相似++、--、+=、-=、=+、=-之類的功能,這給熟悉C語言的使用者編寫awk程序帶來了極大的方便。做爲對運算功能的一種擴展,awk 還提供了一系列內置的運算函數(如log、sqr、cos、sin等等)和一些用於對字符串進行操做(運算)的函數(如length、substr等 等)。這些函數的引用大大的提升了awk的運算功能。 做爲對條件轉移指令的一部分,關係判斷是每種程序設計語言都具有的功能,awk也不例外。awk中容許進行多種測試,如經常使用的==(等於)、!= (不等於)、>(大於)、<(小於)、>=(大於等於)、>=(小於等於)等等,同時,做爲樣式匹配,還提供了~(匹配於) 和!~(不匹配於)判斷。 做爲對測試的一種擴充,awk也支持用邏輯運算符:!(非)、&&(與)、||(或)和括號()進行多重判斷,這大大加強了awk的功能。本文的附錄中列出了awk所容許的運算、判斷以及操做符的優先級。 awk的流程控制 流程控制語句是任何程序設計語言都不能缺乏的部分。任何好的語言都有一些執行流程控制的語句。awk提供的完備的流程控制語句相似於C語言,這給咱們編程帶來了極大的方便。 一、BEGIN和END: 在awk中兩個特別的表達式,BEGIN和END,這二者均可用於pattern中(參考前面的awk語法),提供BEGIN和END的做用是給 程序賦予初始狀態和在程序結束以後執行一些掃尾的工做。任何在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則在掃描完成後打印出總合計。 二、流程控制語句 awk提供了完備的流程控制語句,其用法與C語言相似。下面咱們一一加以說明: 2.一、if...else語句: 格式: if(表達式) 語句1 else 語句2 格式中"語句1"能夠是多個語句,若是你爲了方便awk判斷也方便你自已閱讀,你最好將多個語句用{}括起來。awk分枝結構容許嵌套,其格式爲: if(表達式1) {if(表達式2) 語句1 else 語句2 } 語句3 else {if(表達式3) 語句4 else 語句5 } 語句6 固然實際操做過程當中你可能不會用到如此複雜的分枝結構,這裏只是爲了給出其樣式罷了。 2.二、while語句 格式爲: while(表達式) 語句 2.三、do-while語句 格式爲: do { 語句 }while(條件判斷語句) 2.四、for語句 格式爲: for(初始表達式;終止條件;步長表達式) {語句} 在awk的 while、do-while和for語句中容許使用break,continue語句來控制流程走向,也容許使用exit這樣的語句來退出。break 中斷當前正在執行的循環並跳到循環外執行下一條語句。continue從當前位置跳到循環開始處執行。對於exit的執行有兩種狀況:當exit語句不在 END中時,任何操做中的exit命令表現得如同到了文件尾,全部模式或操做執行將中止,END模式中的操做被執行。而出如今END中的exit將致使程 序終止。 例:爲了 awk中的自定義函數 定義和調用用戶本身的函數是幾乎每一個高級語言都具備的功能,awk也不例外,但原始的awk並不提供函數功能,只有在nawk或較新的awk版本中才能夠增長函數。 函數的使用包含兩部分:函數的定義與函數調用。其中函數定義又包括要執行的代碼(函數自己)和從主程序代碼傳遞到該函數的臨時調用。 awk函數的定義方法以下: function 函數名(參數表){ 函數體 } 在gawk中容許將function省略爲func,但其它版本的awk不容許。函數名必須是一個合法的標誌符,參數表中能夠不提供參數(但在調用函數時函數名後的一對括號仍然是不可缺乏的),也能夠提供一個或多個參數。與C語言類似,awk的參數也是經過值來傳遞的。 在awk中調用函數比較簡單,其方法與C語言類似,但awk比C語言更爲靈活,它不執行參數有效性檢查。換句話說,在你調用函數時,能夠列出比函 數預計(函數定義中規定)的多或少的參數,多餘的參數會被awk所忽略,而不足的參數,awk將它們置爲缺省值0或空字符串,具體置爲什麼值,將取決於參數 的使用方式。 awk函數有兩種返回方式:隱式返回和顯式返回。當awk執行到函數的結尾時,它自動地返回到調用程序,這是函數是隱式返回的。若是須要在結束以前退出函數,能夠明確地使用返回語句提早退出。方法是在函數中使用形如:return 返回值 格式的語句。 例:下面的例子演示了函數的使用。在這個示例中,定義了一個名爲print_header的函數,該函數調用了兩個參數FileName和 PageNum,FileName參數傳給函數當前使用的文件名,PageNum參數是當前頁的頁號。這個函數的功能是打印(顯示)出當前文件的文件名, 和當前頁的頁號。完成這個功能後,這個函數將返回下一頁的頁號。 nawk >'BEGIN{pageno=1;file=FILENAME >pageno=print_header(file,pageno);#調用函數print_header >printf("當前頁頁號是:%d",pageno); >} >#定義函數print_header >function print_header(FileName,PageNum){ >printf("%s %d",FileName,PageNum); >PageNum++;return PageNUm; >} >}' myfile 執行這個程序將顯示以下內容: myfile 1 當前頁頁號是:2 awk高級輸入輸出 1.讀取下一條記錄: awk的next語句致使awk讀取下一個記錄並完成模式匹配,而後當即執行相應的操做。一般它用匹配的模式執行操做中的代碼。next致使這個記錄的任何額外匹配模式被忽略。 2.簡單地讀取一條記錄 awk的 getline語句用於簡單地讀取一條記錄。若是用戶有一個數據記錄相似兩個物理記錄,那麼getline將尤爲有用。它完成通常字段的分離(設置字段變 量$0 FNR NF NR)。若是成功則返回1,失敗則返回0(到達文件尾)。若是需簡單地讀取一個文件,則能夠編寫如下代碼: 例:示例getline的使用 {while(getline==1) { #process the inputted fields } } 也可使getline保存輸入數據在一個字段中,而不是經過使用getline variable的形式處理通常字段。當使用這種方式時,NF被置成0,FNR和NR被增值。 用戶也可使用getline<"filename"方式從一個給定的文件中輸入數據,而不是從命令行所列內容輸入數據。此 時,getline將完成通常字段分離(設置字段變量$0和NF)。若是文件不存在,返回-1,成功,返回1,返回0表示失敗。用戶能夠從給定文件中讀取 數據到一個變量中,也能夠用stdin(標準輸入設備)或一個包含這個文件名的變量代替filename。值得注意的是當使用這種方式時不修改FNR和 NR。 另外一種使用getline語句的方法是從UNIX命令接受輸入,例以下面的例子: 例:示例從UNIX命令接受輸入 {while("who -u"|getline) { #process each line from the who command } } 固然,也可使用以下形式: "command" | getline variable 3.關閉文件: awk中容許在程序中關閉一個輸入或輸出文件,方法是使用awk的close語句。 close("filename") filename能夠是getline打開的文件(也能夠是stdin,包含文件名的變量或者getline使用的確切命令)。或一個輸出文件(能夠是stdout,包含文件名的變量或使用管道的確切命令)。 4.輸出到一個文件: awk中容許用以下方式將結果輸出到一個文件: printf("hello word!")>"datafile" 或 printf("hello word!")>>"datafile" 5.輸出到一個命令 awk中容許用以下方式將結果輸出到一個命令: printf("hello word!")|"sort-t','" awk與shell script混合編程 由於awk能夠做爲一個shell命令使用,所以awk能與shell批處理程序很好的融合在一塊兒,這給實現awk與shell程序的混合編程提 供了可能。實現混合編程的關鍵是awk與shell script之間的對話,換言之,就是awk與shell script之間的信息交流:awk從shell script中獲取所需的信息(一般是變量的值)、在awk中執行shell命令行、shell script將命令執行的結果送給awk處理以及shell script讀取awk的執行結果等等。 1.awk讀取Shell script程序變量 在awk中咱們能夠經過「'$變量名'」的方式讀取sell scrpit程序中的變量。 例:在下面的示例中,咱們將讀取sell scrpit程序中的變量Name,該變量存放的是文本myfile的撰寫者,awk將打印出這我的名。 $cat writename : # @(#) # . . . Name="張三" nawk 'BEGIN {name="'Name'"; printf("%s撰寫者%s",FILENAME,name");} {...}END{...}' myfile . . . 2.將shell命令的執行結果送給awk處理 做爲信息傳送的一種方法,咱們能夠將一條shell命令的結果經過管道線(|)傳遞給awk處理: 例:示例awk處理shell命令的執行結果 $who -u | awk '{printf("%s正在執行%s",$2,$1)}' 該命令將打印出註冊終端正在執行的程序名。 3.shell script程序讀awk的執行結果 爲了實現shell script程序讀取awk執行的結果,咱們能夠採起一些特殊的方法,例如咱們能夠用變量名=`awk語句`的形式將awk執行的結果存放入一個 shell script變量。固然也能夠用管道線的方法將awk執行結果傳遞給shell script程序處理。 例:做爲傳送消息的機制之一,UNIX提供了一個向其全部用戶傳送消息的命令wall(意思是write to all寫給全部用戶),該命令容許向全部工做中的用戶(終端)發送消息。爲此,咱們能夠經過一段shell批處理程序wall.shell來模擬這一程序 (事實上比較老的版本中wall就是一段shell批處理程序: $cat wall.shell : # @(#) wall.shell:發送消息給每一個已註冊終端 # cat >/tmp/$$ #用戶錄入消息文本 who -u | awk '{print $2}' | while read tty do cat /tmp/$$>$tty done 在這個程序裏,awk接受who -u命令的執行結果,該命令打印出全部已註冊終端的信息,其中第二個字段是已註冊終端的設備名,所以用awk命令析出該設備名,而後用while read tty語句循環讀出這些文件名到變量(shell script變量)tty中,做爲信息傳送的終結地址。 4.在awk中執行shell命令行----嵌入函數system() system()是一個不適合字符或數字類型的嵌入函數,該函數的功能是處理做爲參數傳遞給它的字符串。system對這個參數的處理就是將其做爲命令處理,也就是說將其看成命令行同樣加以執行。這使得用戶在本身的awk程序須要時能夠靈活地執行命令或腳本。 例:下面的程序將使用system嵌入函數打印用戶編制好的報表文件,這個文件存放在名爲myreport.txt的文件中。爲簡約起見,咱們只列出了其END部分: . . . END {close("myreport.txt");system("lp myreport.txt");} 在這個示例中,咱們首先使用close語句關閉了文件myreport.txt文件,而後使用system嵌入函數將myreport.txt送入打印機打印。 寫到這裏,我不得不跟朋友們說再見了,實在地說,這些內容仍然是awk的初步知識,電腦永遠是前進的科學,awk也不例外,本篇所能作的只是在你 前行的漫漫長途中鋪平一段小小開端,剩下的路還得靠你本身去走。老實說,若是本文真能給你前行的路上帶來些許的方便,那本人就滿足了! 如對本篇有任何疑問,請E-mail To:Chizlong@yeah.net或到主頁http://chizling.yeah.net中留言。 附錄: 1.awk的常規表達式元字符 換碼序列 ^ 在字符串的開頭開始匹配 $ 在字符串的結尾開始匹配 . 與任何單個字符串匹配 [ABC] 與[]內的任一字符匹配 [A-Ca-c] 與A-C及a-c範圍內的字符匹配(按字母表順序) [^ABC] 與除[]內的全部字符之外的任一字符匹配 Desk|Chair 與Desk和Chair中的任一個匹配 [ABC][DEF] 關聯。與A、B、C中的任一字符匹配,且其後要跟D、E、F中的任一個字符。 * 與A、B或C中任一個出現0次或屢次的字符相匹配 + 與A、B或C中任何一個出現1次或屢次的字符相匹配 ? 與一個空串或A、B或C在任何一個字符相匹配 (Blue|Black)berry 合併常規表達式,與Blueberry或Blackberry相匹配 2.awk算術運算符 運算符 用途 ------------------ x^y x的y次冪 x**y 同上 x%y 計算x/y的餘數(求模) x+y x加y x-y x減y x*y x乘y x/y x除y -y 負y(y的開關符號);也稱一目減 ++y y加1後使用y(前置加) y++ 使用y值後加1(後綴加) --y y減1後使用y(前置減) y-- 使用後y減1(後綴減) x=y 將y的值賦給x x+=y 將x+y的值賦給x x-=y 將x-y的值賦給x x*=y 將x*y的值賦給x x/=y 將x/y的值賦給x x%=y 將x%y的值賦給x x^=y 將x^y的值賦給x x**=y 將x**y的值賦給x 3.awk容許的測試: 操做符 含義 x==y x等於y x!=y x不等於y x>y x大於y x>=y x大於或等於y x<y x小於y x<=y x小於或等於y? x~re x匹配正則表達式re? x!~re x不匹配正則表達式re? 4.awk的操做符(按優先級升序排列) = 、+=、 -=、 *= 、/= 、 %= || && > >= < <= == != ~ !~ xy (字符串連結,'x'y'變成"xy") + - * / % ++ -- 5.awk內置變量(預約義變量) 說明:表中v項表示第一個支持變量的工具(下同):A=awk,N=nawk,P=POSIX awk,G=gawk V 變量 含義 缺省值 -------------------------------------------------------- N ARGC 命令行參數個數 G ARGIND 當前被處理文件的ARGV標誌符 N ARGV 命令行參數數組 G CONVFMT 數字轉換格式 %.6g P ENVIRON UNIX環境變量 N ERRNO UNIX系統錯誤消息 G FIELDWIDTHS 輸入字段寬度的空白分隔字符串 A FILENAME 當前輸入文件的名字 P FNR 當前記錄數 A FS 輸入字段分隔符 空格 G IGNORECASE 控制大小寫敏感0(大小寫敏感) A NF 當前記錄中的字段個數 A NR 已經讀出的記錄數 A OFMT 數字的輸出格式 %.6g A OFS 輸出字段分隔符 空格 A ORS 輸出的記錄分隔符 新行 A RS 輸入的記錄他隔符 新行 N RSTART 被匹配函數匹配的字符串首 N RLENGTH 被匹配函數匹配的字符串長度 N SUBSEP 下標分隔符 "34" 6.awk的內置函數 V 函數 用途或返回值 ------------------------------------------------ N gsub(reg,string,target) 每次常規表達式reg匹配時替換target中的string N index(search,string) 返回string中search串的位置 A length(string) 求串string中的字符個數 N match(string,reg) 返回常規表達式reg匹配的string中的位置 N printf(format,variable) 格式化輸出,按format提供的格式輸出變量variable。 N split(string,store,delim) 根據分界符delim,分解string爲store的數組元素 N sprintf(format,variable) 返回一個包含基於format的格式化數據,variables是要放到串中的數據 G strftime(format,timestamp) 返回一個基於format的日期或者時間串,timestmp是systime()函數返回的時間 N sub(reg,string,target) 第一次當常規表達式reg匹配,替換target串中的字符串 A substr(string,position,len) 返回一個以position開始len個字符的子串 P totower(string) 返回string中對應的小寫字符 P toupper(string) 返回string中對應的大寫字符 A atan(x,y) x的餘切(弧度) N cos(x) x的餘弦(弧度) A exp(x) e的x冪 A int(x) x的整數部分 A log(x) x的天然對數值 N rand() 0-1之間的隨機數 N sin(x) x的正弦(弧度) A sqrt(x) x的平方根 A srand(x) 初始化隨機數發生器。若是忽略x,則使用system() G system() 返回自1970年1月1日以來通過的時間(按秒計算)