• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 76,  comments - 621,  trackbacks - 0

            IBM參考文章:http://www-128.ibm.com/developerworks/cn/linux/shell/awk/awk-1/index.html

            AWK是一種優良的文本處理工具。它不僅是 Linux 中也是任何環境中現有的功能最強大的數據處理發動機之一。這種編程及數據操作語言(其名稱得自于它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母)的最大功能取決于一個人所擁有的知識。 AWK 提供了極其強大的功能:可以進行樣式裝入、流控制、數學運算符、進程控制語句甚至于內置的變量和函數。它具備了一個完整的語言所應具有的幾乎所有精美特性。實際上 AWK 的確擁有自己的語言: AWK 程序設計語言,三位創建者已將它正式定義為“樣式掃描和處理語言”。它允許您創建簡短的程序,這些程序讀取輸入文件、為數據排序、處理數據、對輸入執行計算以及生成報表,還有無數其他的功能。

                  你可能對UNIX比較熟悉,但你可能對awk很陌生,這一點也不奇怪,的確,與其優秀的功能相比,awk還遠沒達到它應有的知名度。awk是什么?與其它大多數UNIX命令不同的是,從名字上看,我們不可能知道awk的功能:它既不是具有獨立意義的英文單詞,也不是幾個相關單詞的縮寫。事實上,awk是三個人名的縮寫,他們是:Aho、(Peter)Weinberg和 (Brain)Kernighan。正是這三個人創造了awk—一個優秀的樣式掃描與處理工具。

                最簡單地說, AWK 是一種用于處理文本的編程語言工具。AWK 在很多方面類似于 shell 編程語言,盡管 AWK 具有完全屬于其本身的語法。它的設計思想來源于 SNOBOL4 、sed 、Marc Rochkind設計的有效性語言、語言工具 yacc 和 lex ,當然還從 C 語言中獲取了一些優秀的思想。在最初創造 AWK 時,其目的是用于文本處理,并且這種語言的基礎是,只要在輸入數據中有模式匹配,就執行一系列指令。該實用工具掃描文件中的每一行,查找與命令行中所給定內容相匹配的模式。如果發現匹配內容,則進行下一個編程步驟。如果找不到匹配內容,則繼續處理下一行。

                盡管操作可能會很復雜,但命令的語法始終是:

                awk ‘{pattern + action}’ {filenames}

                其中 pattern 表示 AWK 在數據中查找的內容,而 action 是在找到匹配內容時所執行的一系列命令?;ɡㄌ?({}) 不需要在程序中始終出現,但它們用于根據特定的模式對一系列指令進行分組。

                gawk 是 AWK 的 GNU 版本。

            一、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%sn”,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!n”,$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語言,這給我們編程帶來了極大的方便。

            1、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則在掃描完成后打印出總合計。

                  2、流程控制語句

                  awk提供了完備的流程控制語句,其用法與C語言類似。下面我們一一加以說明:

            2.1、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.2、while語句

            格式為:

            while(表達式)
            語句

            2.3、do-while語句

            格式為:

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

            2.4、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(”當前頁頁號是:%dn”,pageno);
            >}

            >#定義函數print_header
            >function print_header(FileName,PageNum){
            >printf(”%s %dn”,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"t

                  filename可以是getline打開的文件(也可以是stdin,包含文件名的變量或者getline使用的確切命令)?;蛞粋€輸出文件(可以是stdout,包含文件名的變量或使用管道的確切命令)。

                  4.輸出到一個文件:

            awk中允許用如下方式將結果輸出到一個文件:

            printf("hello word!n"t>“datafile”

            printf(”hello word!n”t>>”datafile”

                  5.輸出到一個命令

            awk中允許用如下方式將結果輸出到一個命令:

            printf(”hello word!n”t|”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(”t%st撰寫者%sn”,FILENAME,name”t;}
            {…}END{…}’ myfile
            .
            .
            .

            2.將shell命令的執行結果送給awk處理

            作為信息傳送的一種方法,我們可以將一條shell命令的結果通過管道線(|)傳遞給awk處理:

            例:示例awk處理shell命令的執行結果

            $who -u | awk ‘{printf(”%s正在執行%sn”,$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”t;system(”lp myreport.txt”t;}

            在這個示例中,我們首先使用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
            xx<=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日以來經過的時間(按秒計算)

            posted on 2008-03-11 14:08 megax 閱讀(260) 評論(0)  編輯 收藏 引用 所屬分類: 轉貼收集
            久久久精品久久久久特色影视| 久久这里都是精品| 久久精品天天中文字幕人妻 | 国产精品热久久无码av| 久久国产乱子伦精品免费午夜| 久久亚洲国产精品123区| 久久免费看黄a级毛片| 蜜臀久久99精品久久久久久小说| 久久精品中文无码资源站 | 久久综合久久综合久久| 久久国产精品国语对白| 亚洲七七久久精品中文国产| 亚洲综合精品香蕉久久网| 成人精品一区二区久久久| 亚洲欧洲久久久精品| 欧洲精品久久久av无码电影| 精品久久久久久无码中文字幕| 亚洲AV无一区二区三区久久| 国产真实乱对白精彩久久| 麻豆AV一区二区三区久久| 国内精品久久久久久不卡影院| 一本色道久久88精品综合| 久久久久亚洲精品中文字幕| 国产情侣久久久久aⅴ免费| 99久久免费国产精品特黄| 精品国产青草久久久久福利| 成人妇女免费播放久久久| 久久久久久久波多野结衣高潮 | 麻豆精品久久久一区二区| 久久精品国产AV一区二区三区 | 精品久久久中文字幕人妻| 久久久久亚洲精品无码网址| 国产精品99久久不卡| 久久国产成人精品麻豆| 99久久婷婷免费国产综合精品| 一本色道久久HEZYO无码| 久久狠狠爱亚洲综合影院| 成人午夜精品无码区久久| 模特私拍国产精品久久| 99久久综合国产精品免费| 99久久香蕉国产线看观香|