7.gawk功能:gawk程式設計

tonykorn97發表於2006-08-12

7.1 變數

7.1.1 數字和字串常量

awk中,變數不需要定義就可以直接使用,使用一個變數就是對變數的定義。變數的型別可以是數字,字串,或者兩者都是。在賦值的時候,等號右邊表示式的型別就是變數的型別。


7.1.2 自定義變數

自定義變數由字母,數字和下劃線組成,但是不能以數字開頭。Awk中的變數不需要宣告。Awk根據表示式中的變數。如果變數沒有初始化,awk就初始化字串變數的值為NULL,數值變數值為0。如果有必要,awk能把數字變數轉換為字串變數,或者相反。變數透過賦值符號被賦值

賦值符號

符號

含義

等價形式

=

a=5

a=5

+=

a=a+5

a+=5

-=

a=a-5

a-=5

*=

a=a*5

a*=5

/=

a=a/5

a/=5

%=

a=a%5

a%=5

^=

a=a^5

a^=5

遞增和遞減運算子

遞增運算子用於在運算元上加1。表示式x++等價於x=x+1.類似的,遞減運算子的作用是在運算元上減少1。表示式x-等價於x=x-1.

命令列自定義變數。可以在命令列中給變數賦值,然後再把這個變數傳輸給awk指令碼。

-v選項(awk)。Awk-v選項允許BEGIN語句處理命令列引數。對於每一個從命令列傳輸的引數,他們前面都必須有-v選項。

域變數。域變數的用法類似於自定義變數,只是域變數引用的域不同。

內建變數。內建變數的名字是由大寫字母組成。他們事先被賦值並可以在表示式中使用。

內建變數清單

變數名

變數內容

ARGC

命令列引數的數量

ARGIND

命令列正在處理的當前檔案的AGV的索引(僅在gawk中有效)

ARGV

命令列引數陣列

CONVFMT

轉換數字格式(僅在gawk中有效),預設%.6g

ENVIRON

shell傳遞來的包含當前環境變數的陣列

ERRNO

當使用close函式或者透過getline函式讀取的時候,發生的重新定向錯誤的描述資訊九儲存在這個變數中(僅在gawk中有效)

FIELDWIDTHS

在對記錄進行固定域寬的分割時,可以替代FS的分割符的列表(僅在gawk中有效)

FILENAME

當前的輸入檔名

FNR

當前檔案的記錄號

FS

輸入域分割符,預設是空格

IGNORECASE

在正規表示式和字串操作中關閉大小寫敏感(僅在gawk中有效)

NF

當前檔案域的數量

NR

當前檔案的記錄數

OFMT

數字輸出格式

OFS

輸出域分割符

ORS

輸出記錄分割符

RLENGTH

透過match函式匹配字串的長度

RS

輸入記錄分割符

RSTART

透過match函式匹配字串的偏移量

RT

記錄結束符在輸入文字的時候,gawk把它設為與RS相同

SUBSEP

下標分割符

7.1.3 BEGIN模組

BEGIN模組後面緊跟著動作塊,這個動作塊在awk處理任何輸入檔案行之前執行。事實上,BEGIN塊可以在沒有任何輸入檔案的條件下測試,因為在BEGIN塊執行完畢以前awk不讀取任何輸入檔案。BEGIN塊通常被用來改變內建變數的值,例如OFS,RS以及FS等等。初始化自定義變數的值;以及列印輸出標題

例子:awk ‘BEGIN{FS=”:”; OFS=”t”; ORS=”nn”}{print $1,$2,$3}’ file

在處理輸入檔案以前,域分割符(FS)被設定為冒號,輸出檔案分隔符(OFS)被設定為製表符,輸出記錄分隔符(ORS)被設定為兩個換行符。如果在動作模組中有多個語句,那麼他們之間應該用分號分割,或者寫在不同的行上(在命令列環境下用反斜槓轉義換行符)。

7.1.4 END模組

END模組不匹配任何輸入檔案,但是執行動作塊中的所有動作,END模組在整個輸入檔案處理完畢後被處理。

7.2 重新定向和管道

7.2.1 輸出檔案的重新定向

當使用>的時候,檔案就被開啟並截斷;一旦檔案被開啟,直到檔案被明確地關閉或者awk程式終止,它都會一直保持被開啟的狀態。來自後面的列印語句的輸出會追加到前面內容的裡面。

符號>>用來開啟一個檔案但是不清空檔案。重新定向的輸出只是被追加到這個檔案的後面。

7.2.2 輸入重新定向(getline

getline函式的作用是從標準輸入,管道或者當前正在處理的檔案之外的其他輸入檔案獲得輸入。它負責從輸入獲得下一行的內容,並給NF,NRFNR等內建變數賦值。如果得到一個記錄,getline函式就返回1,如果到達檔案的末尾就返回0。如果出現錯誤,例如開啟檔案失敗,就返回-1.

7.3 管道

如果你在awk程式中開啟一個管道,那麼在開啟下一個管道之前必須關閉它。管道符號右邊可以透過雙引號關閉管道。在同一時刻只能有一個管道存在。

7.4 關閉檔案和管道

如果你打算在awk程式中再次使用檔案,管道來進行讀或者寫,則先要關閉它,因為知道指令碼結束它都不會自動關閉。一旦開啟,管道就保持開的狀態直到awk退出。所有END模組中的語句對管道也是有效的,END模組的第一行語句就是關閉管道。

System函式。內建的system函式把Linux命令作為引數執行這些命令,然後返回退出狀態值給awk程式。

fflush函式

7.6 條件語句

7.6.1 if語句

if開頭的語句結構是動作語句。透過條件模組,If可以被隱含。透過條件動作語句,可以清楚地說明if 用法,If後面緊跟的語句必須放在括號內。如果括號內的表示式的值是真(非0或者非空),就執行緊跟著的語句或者語句塊。如果執行語句多於一條,那麼每條語句都需要以分號表示結束,且所有語句需要放在一對花括號中間,以便作為一個整天執行。

If (expression){

Statement;statement;…

}

7.6.2 if/else語句

if/else語句可以做雙重判斷。如果if關鍵字後面的表示式為真,那麼跟這個表示式捆綁在一起的語句就被執行。如果If表示式的結果是假或者0,那麼關鍵字else後面的語句塊就被執行。如果Ifelse包含多條語句,那麼就需要用一對花括號把它們括在以前,作為一個語句塊。

{ if (expression){

statement; statement; …

}

else{

statement; statement;…

}

}

7.6.3 if/else else if 語句

if/else else if 語句可以做多重判斷。

{ if (expression){

statement; statement; …

}

else if (expression) {

statement; statement; …

}

else if (expression) {

statement; statement; …

}

else {

statement;

}

}

7.7 迴圈

7.7.1 while迴圈

使用while迴圈的第一步是設定變數的初試值。這個值將在while表示式中被測試。如果表示式求值為真,就進入迴圈體,執行迴圈體中的語句(若迴圈體有多個語句,就需要用花括號把這些語句括起來)。在迴圈體結束以前,控制迴圈表示式的變數的值必須被改變,否則,就會陷入無限迴圈。

例子:awk ‘{ i=1; while i <= NF{ print NF,$i ; i++ }}’ filename

變數i的初試值是1。若i小於或者等於NF(記錄中域的個數),則執行列印語句,且i增加1。然後再測試表示式,直到i的值大於NF.直到處理信的記錄i才重新初始化。

7.7.2 for迴圈

for迴圈和while迴圈的實質是一樣的,只是for迴圈的括號中有三個表示式:初始化變數的表示式,測試表示式以及更新格式表示式中所使用的變數的表示式。在awk中,括號裡面第一個初始化語句只能初始化一個變數(在c語言中可以透過用冒號分割進行多個初始化)。

例子:awk ‘{ for (i=1;i<=NF;i++) print NF,$i }’ filex

變數i被初始化為1,並在測試表示式中測試它是否小於或者等於NF。如果是,print函式就可以NF值並列印該記錄的第I個域,然後i再增加1for迴圈經常用在END模板中迴圈處理陣列所有的元素)。

7.7.3 迴圈控制

break continue語句。Break語句使你能在滿足某個特定條件時跳出迴圈。在滿足某個特定條件的情況下,continue可以使迴圈忽略任何語句,而直接返回迴圈的頂端,開始下一次重複。

7.8 程式控制語句

7.8.1 next語句

next語句從輸入檔案中讀取下一行,然後從頭開始執行awk指令碼。

7.8.2 exit語句

exit語句用於結束awk程式。它終止對記錄的處理,但是不會忽略end模組,如果exit語句被賦予一個0255之間的引數(例如 exit 1,這個引數就被列印到命令列,以判斷退出成功還是失敗。

7.9 陣列

因為awk中陣列的下標可以是數字和字母,所以稱為關聯陣列(associative array.陣列的下標(subscript)通常稱為關鍵字(key)並且跟相應元素的值有關係。值和關鍵字都存在內部的一張對問題中的關鍵字和值應用雜湊法運演算法則的表格裡(也就是雜湊表)。

陣列和變數一樣,都是在使用的時候自動建立,awk可以自己判斷其儲存的數字是數字還是字串。根據內容的不同,awk的陣列初試值是數字0或空字串。

7.9.1 下標與關聯陣列

用變數作為陣列索引。變數可以作為陣列下標值的索引,該變數的值可以是陣列或者字串。

Special for迴圈。Special for 迴圈在for迴圈一旦無法發揮作用的時候,用於迴圈讀取關聯陣列中的元素。當下標是字串或者是不連續的數字時,special for迴圈就把下標作為關鍵字。訪問跟其關聯的值。

用字串作為下標。下標可以時文字或者包含字串的變數。如果下標是文字,那麼必須用雙引號括起來。

用域值作為陣列的下標。任何表示式都可以用做陣列的下標,域當然也可以。

陣列和split函式。Awk的內建函式split允許你把一個字串分割為單詞並儲存在陣列中。你可以自動定義域分割符或者使用現在FS(域分隔符)的值。

Delete函式。該函式用於刪除陣列元素。

Awk的多維陣列。

7.10 awk內建函式。

7.10.1 字串函式

subgsub函式。Sub函式匹配記錄中最大,最靠左邊的子字串的正規表示式,並用替換字串替換這些字串。

Index函式。Index函式返回子字串第一次被匹配的位置,偏移量從位置1開始。

Length函式。Length函式返回沒有引數的字串的長度。Length函式返回整個記錄中的字元數。

Substr函式。Substr函式返回從位置1開始的字串的子字串。如果子字串的長度給定,就返回字串的一部分。如果知道的長度超過實際長度,就返回整個字串。

Match函式。Match函式返回在字串中正規表示式位置的索引,如果找不到指定的正規表示式就返回0Match函式設定內建變數RSTART維字串中子字串的開始位置,RELENGTH為到子字串末尾的字元個數。

Touppertolower函式(僅在gawk中有效)。Toupper函式把字串中所有的小寫字母都變成大寫字母,而非字母的字元則不改變。Tolower函式把字串中所有的大寫字母都變成小寫,而非字母的字元則不改變。

Split函式。Split函式使用作為第三個引數的域分割符把字串分割為一個陣列。如果第三個引數沒有提供,awk就預設使用當前FS值。

Sprintf函式。Sprintf函式返回指定格式的表示式,這個函式允許你使用printf函式 格式說明符。

7.10.2 時間函式

systime函式。Systime函式返回從197011日(稱為元年)開始到當前時間(不計閏年)的整秒數。

Strftime函式。Strftime函式使用C庫中的strftime函式格式化時間。格式說明符的格式是%T或%D等等。

7.10.3 內建數學函式。

名稱

返回值

Atan2(x,y)

Y,x範圍內的餘切

Cos(x)

餘弦函式

Exp(x)

求冪

Int(x)

取整

Log(x)

自然對數

Rand()

隨機數

Sin(x)

正弦

Sqrt(x)

平方根

Srand(x)

Xrand()函式的種子

7.10.4 整數函式

int函式透過去掉浮點數的小數點右邊的部分,把浮點數變為整數,這個過程中沒有舍入。

7.10.5 隨機數發生器

rand函式。Rand函式用來產生一個大於等於0而小於1的隨即數。

Srand函式。沒有引數的srand函式用時間作為rand函式的種子。Srand(x)則用x作為種子,在程式執行過程中,x應當是不斷變化的。

7.11 自定義函式

自定義函式可以放在指令碼中任何可以放置模板和動作的地方

格式:

function name ( parameter, parameter, parameter, … ) {

statements

returen expression

(the return statement and expression are optional )

}

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/312079/viewspace-245428/,如需轉載,請註明出處,否則將追究法律責任。

相關文章