AWK 學習筆記

若是要格式化報文或從一個大的文本文件中抽取數據包,那麼awk能夠完成這些任務。它
在文本瀏覽和數據的熟練使用上性能優異。
能夠說awk是一種自解釋的編程語言,之因此要在shell中使用awk
是由於awk自己是學習的好例子,但結合awk與其餘工具諸如grep和sed,將會使shell編程更加
容易。

一、調用awk
第一種是命令行方式
awk [-Ffield-separator] 'commands' input-file
第二種方法是將全部awk命令插入一個文件,並使awk程序可執行,而後用awk命令解釋
器做爲腳本的首行,以便經過鍵入腳本名稱來調用它。
第三種方式是將全部的awk命令插入一個單獨文件,
awk -f awk-scripts-file input-file
-f選項指明在文件awk_script_file中的awk腳本,input_file(s)是使用awk進行瀏覽的文件
名。
二、awk腳本
在命令中調用awk時,awk腳本由各類操做和模式組成。
若是設置了-F選項,則awk每次讀一條記錄或一行,並使用指定的分隔符分隔指定域,但
若是未設置-F選項,awk假定空格爲域分隔符,並保持這個設置直到發現一新行。當新行出現
時,awk命令獲悉已讀完整條記錄,而後在下一個記錄啓動讀命令,這個讀進程將持續到文件
尾或文件再也不存在
2-一、模式和動做
任何awk語句都由模式和動做組成。在一個awk腳本中可能有許多語句。模式部分決定動
做語句什麼時候觸發及觸發事件。處理即對數據進行的操做。若是省略模式部分,動做將時刻保
持執行狀態。
模式能夠是任何條件語句或複合語句或正則表達式。模式包括兩個特殊字段BEGIN和
END。使用BEGIN語句設置計數和打印頭。BEGIN語句使用在任何文本瀏覽動做以前,以後
文本瀏覽動做依據輸入文件開始執行。END語句用來在awk完成文本瀏覽動做後打印輸出文
本總數和結尾狀態標誌。若是不特別指明模式,awk老是匹配或打印行數。
實際動做在大括號{}內指明。動做大多數用來打印,可是還有些更長的代碼諸如if和循環
(looping)語句及循環退出結構。若是不指明採起動做,awk將打印出全部瀏覽出來的記錄。
下面將深刻講解這些模式和動做
2-二、域和記錄
awk執行時,其瀏覽域標記爲$1,$2...$n。這種方法稱爲域標識。使用這些域標識將更容
易對域進行進一步處理。
使用$1,$3表示參照第1和第3域,注意這裏用逗號作域分隔。若是但願打印一個有5個域
的記錄的全部域,沒必要指明$1,$2,$3,$4,$5,可以使用$0,意即全部域。Awk瀏覽時,到達一新
行,即假定到達包含域的記錄末尾,而後執行新記錄下一行的讀動做,並從新設置域分隔。
注意執行時不要混淆符號$和shell提示符$,它們是不一樣的。
爲打印一個域或全部域,使用print命令。這是一個awk動做(動做語法用圓括號括起來)。

保存awk輸出
有兩種方式保存shell提示符下awk腳本的輸出。最簡單的方式是使用輸出重定向符號>文
件名,下面的例子重定向輸出到文件wow。
awk '{print $0}' somefile >wow
第二種方法是使用 tee命令,在輸出到文件的同時輸出到屏幕。

使用標準輸入
scripts.awk somefile
或者
scripts.awk <somefile
somefile | scripts.awk

打印報告頭
打印信息頭放置在 B E G I N模式部分,由於打印信息頭被界
定爲一個動做,必須用大括號括起來。
awk 'BEGIN{print "Name    Belt\n------------------"}
{print $1"\t"$4}' somefile

打印信息尾
若是在末行加入end of report信息,可以使用END語句。END語句在全部文本處理動做執行
完以後才被執行。END語句在腳本中的位置放置在主要動做以後。
awk 'BEGIN{print "Name    Belt\n------------------"}
{print $1"\t"$4} somefile
END {"end-of-report"}' somefile

awk錯誤信息提示
當第一次使用awk時,可能被錯誤信息攪得不知所措,但經過長時間和不斷的學習,可總
結出如下規則。在碰到awk錯誤時,可相應查找:
確保整個awk命令用單引號括起來。
確保命令內全部引號成對出現。
確保用花括號括起動做語句,用圓括號括起條件語句。
可能忘記使用花括號,也許你認爲沒有必要,但awk不這樣認爲,將按之解釋語法。

元字符
\ ^ $ . [] | () * + ?
+ 使用+匹配一個或多個字符。
? 匹配模式出現頻率。例如使用/XY?Z/匹配XYZ或YZ。

awk內置變量
ARGC        命令行參數個數
ARGV        命令行參數排列
ENVIRON        支持隊列中系統環境變量的使用
FILENAME    awk瀏覽的文件名
FNR            瀏覽文件的記錄數
FS            設置輸入域分隔符,等價於命令行-F選項
NF            瀏覽記錄的域個數
NR            已讀的記錄數
OFS            輸出域分隔符
ORS            輸出記錄分隔符
RS            控制記錄分隔符

ARGC        支持命令行中傳入awk腳本的參數個數。ARGV是ARGC的參數排列數組,其中每
一元素表示爲ARGV[n],n爲指望訪問的命令行參數。
ENVIRON        支持系統設置的環境變量,要訪問單獨變量,使用實際變量名,例如
ENVIRON[「EDITOR」]=「Vi」。
FILENAME    支持awk腳本實際操做的輸入文件。由於awk能夠同時處理許多文件,所以如
果訪問了這個變量,將告之系統目前正在瀏覽的實際文件。
FNR            支持awk目前操做的記錄數。其變量值小於等於NR。若是腳本正在訪問許多文件,
每一新輸入文件都將從新設置此變量。
FS            用來在awk中設置域分隔符,與命令行中-F選項功能相同。缺省狀況下爲空格。若是用
逗號來做域分隔符,設置FS=","。
NF            支持記錄域個數,在記錄被讀以後再設置。
OFS            容許指定輸出域分隔符,缺省爲空格。若是想設置爲#,寫入OFS="#"。
ORS            爲輸出記錄分隔符,缺省爲新行(\n)。
RS            是記錄分隔符,缺省爲新行(\n)。

內置的字符串函數
gsub(r,s)在整個$0中用s替代r
gsub(r,s,t)在整個t中用s替代r
index(s,t)返回s中字符串t的第一位置
length(s)返回s長度
match(s,r)測試s是否包含匹配r的字符串
split(s,a,fs)在fs上將s分紅序列a
sprint(fmt,exp)返回經fmt格式化後的exp
sub(r,s)用$0中最左邊最長的子串代替s
substr(s,p)返回字符串s中從p開始的後綴部分
substr(s,p,n)返回字符串s中從p開始長度爲n的後綴部分

正則表達式

相關文章
相關標籤/搜索