閱讀432 返回首頁    go 阿裏雲 go 技術社區[雲棲]


awk詳解

awk   工具詳解

 


 

awk曆史

 

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

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

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

awk '{pattern + action}' {filenames}





其中 pattern 表示 AWK 在數據中查找的內容,而 action 是在找到匹配內容時所執行的一係列命令。花括號({})不需要在程序中始終出現,但它們用於根據特定的模式對一係列指令進行分組。 pattern就是要表示的正則表達式,用斜杠括起來。

gawk 是 AWK 的 GNU 版本

 

如果說,通常意義上的文本工具或者是編程語言,都是以處理單個文件為單位的話,那麼,awk則是好比是一個文本處理機,awk可以接收輸入的文件,然後對文本中的文字進入處理然後輸出。

 


 

 

awk  使用詳解

 

awk語言的最基本功能是在文件或者字符串中基於指定規則瀏覽和抽取信息,awk抽取信息後,才能進行其他文本操作。完整的awk腳本通常用來格式化文本文件中的信息。

 

通常,awk是以文件的一行為處理單位的。awk沒接收文件的一行,然後執行相應的命令,來處理文本。

 

 

調用awk

 

有三種方式調用awk:

第一:命令行方式

 

awk [-F  field-separator]  'commands'  input-file(s)

 

其中,commands 是真正awk命令,[-F域分隔符]是可選的。 input-file(s) 是待處理的文件。

在awk中,文件的每一行中,由域分隔符分開的每一項稱為一個域。通常,在不指名-F域分隔符的情況下,默認的域分隔符是空格。

 

例:

如果你的文件中,一行中,是用#號來作為每一項的分割符的時候,那麼可以直接使用-F #來指定域分隔符為#

awk -F # 'commands'  input-file(s)

 

從而使文本處理很方便了。

 

 

第二種:將所有的awk命令插入一個文件,並使awk程序可執行,然後awk命令解釋器作為腳本的首行,一遍通過鍵入腳本名稱來調用。

 

相當於shell腳本首行的:#!/bin/sh

可以換成:#!/bin/awk

 

第三種方式是將所有的awk命令插入一個單獨文件,然後調用:

 

awk -f awk-script-file input-file(s)

其中,-f選項加載awk-script-file中的awk腳本,input-file(s)跟上麵的是一樣的。

 

awk基本語法特點

 

傳統awk程序的配置如下:

 

pattern  {action}                         如果模式匹配,則執行操作

 

pattern                                      如果模式匹配,則打印記錄(在不指定動作的情況下,默認會打印一條記錄)

 

            {action}                        沒有模式,則針對每條記錄,執行操作

 

任何awk語句都是由模式和動作組成。在一個awk腳本中可能有許多語句,模式部分決定動作合適觸發及觸發事件。處理即是對數據進行操作。如果省略模式部分,動作將時刻保持執行狀態,也就是說,如果模式部分省略了,則操作會針對每條記錄無條件的執行。

 

awk語句中,用/······/來界定正則表達式,用‘ ’單引號來定界語句,實際動作在大括號{}內指明。通常都是:'{ action1;action2 }',{}中,如果有多條語句,例如print  if  以及賦值,等,就必須用分號;來間隔,不能用空格作為語句動作分隔符。

 

模式可以是任何條件語句或者符合語句或者正則表達式。模式包括兩個特殊字段  BEGIN和END。BEGIN語句使用在任何文本瀏覽動作之前,然後文本瀏覽動作依據輸入文本開始執行。END語句用來在awk完成文本瀏覽動作之後執行。默認情況下,awk總是匹配或者打印行數。

 

awk讀取文件記錄的方式

 

awk每次在文件中讀取一行,找到域分隔符(這裏是#),設置其域n,直至一新行(這裏是缺省記錄分隔符/n 換行符),然後劃分這一行作為一條記錄,接著awk再次啟動下一行讀進程

 

                                                             test-file文件

 


域1                       域分隔符        域2        域分隔符          域3         域分隔符             域4及換行

 

 


(記錄1)feiyinzi          #            200705         #                 24          #                      女  /n

 

 


 

(記錄2)feiyinzilgd      #            200706         #                 27          #                      男   /n

 


那麼,awk工作流程是這樣的:先執行BEGING,然後考試瀏覽文件,讀入有/n換行符分割的一條記錄,然後將記錄按指定的#域分隔符劃分域,填充域$n,那麼這裏對應的feiyinzi 為$1,200705即為域$2······一次類推,然後$0則表示所有域。然後開始執行模式所對應的動作action,然後開始讀入第二條記錄······直到所有的記錄都讀完,然後最後執行END操作。

 

 

例程:

我們想要打印每一條記錄的姓名,則可以使用一下命令

awk -F # '{print $1}' test-file 執行結果如下: feiyinzi feiyinzilgd

 

一般,可以使用BEGIN來打印報告頭,END用來打印報告尾

 

awk -F # 'BEGIN {print "Name/n----------------/n"} {print $1} END {print "end of file"}' 運行結果如下: Name -------------------------- feiyinzi feiyinzilgd

 

 

awk的模式匹配中,正則表達式基本規則不變。

 

 

awk內置變量

 

awk有許多內置變量用來設置環境信息,這些變量可以被改變,下表中給出了最常用的一些變量。

 


               ARGC                                   命令行參數個數

               ARGV                                   命令行參數排列

               ENVIRON                             支持隊列中係統環境變量的使用

               FILENAME                            awk瀏覽的文件名

               FNR                                     瀏覽文件的記錄數

               FS                                       設置輸入域分隔符,等價於命令行 -F選項

               NF                                       瀏覽記錄的域的個數

               NR                                       已讀的記錄數

               OFS                                     輸出域分隔符

               ORS                                     輸出記錄分隔符

               RS                                       控製記錄分隔符


在對這些變量 設置中,可以放在{}之內,然後用分號;和其他的操作分開。

 

 

在實際運用當中,適當合理的使用這些變量,是非常有用的。

 

 


                                                                                                                                                                     2010年2月21日下午

 

 

 

 


版權申明:
轉載文章請注明原文出處https://blog.csdn.net/feiyinzilgd/archive/2010/02/21/5314588.aspx
並請聯係譚海燕本人或者前往譚海燕個人主頁留言

最後更新:2017-04-02 04:25:59

  上一篇:go svn安裝
  下一篇:go magento -- 給後台分類管理頁的分類商品加一欄商品類型