awk的使用 第二部分 awk的執行方式

2021-06-18 18:38:17 字數 3938 閱讀 1282

在linux/unix 的命令列上輸入一下格式的指令: ( 「$」表shell命令列上 的提示符號)

$awk   『awk程式』   資料檔名

上面這條語句中,awk會先編譯該程式, 然後執行該程式來處理所指定的資料檔案。

awk程式的主要結構: awk程式中主要語法是 pattern ,即模式, 所以常見的awk 程式的機構如下:

pattern1

pattern2

……pattern3

pattern 是什麼? awk 可接受許多不同型態的pattern。 一般常使用 「關係表示式」(relational expression) 來當成 pattern。 例如: x > 34 是乙個pattern, 判斷變x與34是否存在大於的關係。 x == y是乙個pattern, 判斷變數x與變數y是否存在等於的關係。 上式中 x>34 ,x ==y 便是典型的pattern。 awk 提供c 語言中常見的關係運算子(relational operators) 如 >, <, >=, <=, ==, != 。此外, awk 還提供~ (匹配match) 及 !~(非匹配not match) 二個關係運算子。 其用法與涵義如下:

如果a 為一字串, b 為一正規表示式(regular expression) ,a ~ b 判斷字串a 中是否包含能匹配(match)b表示式的子字串。 a !~ b 判斷字串a 中是否不包含能匹配(match)b表示式的子字串。 例如:」banana」 ~ /an/ 整個是乙個pattern。 因為」banana」中含有可以匹配/an/的子字串,所以此關係式成立  (true),整個pattern的值為true。

有少數awk文章, 把~, !~ 當成另一類的操作符(operator),而不作為一種 relational operator。在這裡將這兩個運算子當成一種relational operator。  

actions 是什麼?

actions 是由許多awk指令構成。awk 的指令與c 語言中的指令十分類似。 例如:awk 的i/o指令: print, printf( ), getline……

awk的流程控制指令:

if(…) else, while(…)…

awk 如何處理模式和動作的呢?(pattern ? ),awk 會先判斷(evaluate)pattern的值, 如果pattern的值為true (或不為0的數字,或不是空的字串),則awk將執行該pattern所對應的actions。否則,如果pattern之值不為true, 則awk 將不執行該pattern所對應的actions。

例如:如果awk程式中有下列兩指令 50 > 23 「banana」 ~ /123/

awk會先判斷50 >23 是否成立,因為該式成立,所以awk將列印出」hello! the word!!」。 而另一pattern 為」banana」 ~/123/, 因為」banana」 內未含有任何子字串可匹配(match)/123/,所以pattern 的值是false,awk將不會列印出 「good morning !」  

awk 如何處理 的語法是什麼呢?

有時語法pattern 中,pattern 部分會省略,只剩下 。這種情況表示」無條件執行這個actions」。  

awk 的字段變數

awk 所內建的字段變數及其涵意如下:

字段變數     含義

$0                一字串, 其內容為目前awk 所讀入的資料行。

$1               $0 上第乙個欄位的資料。

$2                $0 上第二個欄位的資料

其餘類推 。

讀入資料行時,awk如何更新(update)這些內建的字段變數?

當awk 從資料檔案中讀取乙個資料行時,awk 會使用內建變數$0 進行記錄。當$0 被改動時(例如:讀入新的資料行或改變$0的值…), awk 會立刻重新分析$0的字段情況,並將$0上各字段的資料用$1,$2…進行記錄。  

awk 的內建變數(built-in variables)

awk 提供了許多內建變數,使用者可以在程式中使用這些變數來取得相關資訊。常見的內建變數有:

內建變數                   含義

nf                               number of fields 為一整數,其值表示$0上所存在的字段數目。

nr                               number of records為一整數,其值表示awk 已讀入的資料行數目。 

filename             awk正在處理的資料檔案檔名。

例如:awk 從資料檔案emp.dat 中讀入第一筆資料行「a101 chenying 100 210」之後,程式中:$0 的值就是「a101 chenying 100 210」,$1的值是 「a101″,$2 的值是 「chenying」,$3的值是100,$4的值是210,$nf的值是4,$nr 的值是1,$filename 的值是」emp.dat」。

awk 的工作流程:執行awk 時,它會反覆進行下列四步驟:

1、自動從指定的資料檔案中讀取乙個資料行。   

2、自動更新(update)相關的內建變數之值。 如:nf,nr,$0…

3、依次執行程式中所有的pattern 指令。   

4、當執行完程式中所有pattern 時,如果資料檔案中還有未讀取的資料,則反覆執行步驟1到步驟4。awk會自動重複進行上述4個步驟,使用者不須於程式中編寫這個迴圈(loop)。  

列印檔案中指定的字段資料並加以計算

awk 處理資料時,它會自動從資料檔案中一次讀取一行記錄,並將該資料切分成乙個個的字段;程式中可使用$1,$2,…直接取得各個欄位的內容。這個特色讓使用者輕易地使用awk 編寫reformatter 來改變資料格式。

例子:以檔案emp.dat 為例,計算每人應發工資並列印報表。

分析:awk 會自行一次讀入一行資料,所以程式中僅需告訴awk 如何處理所讀入的資料行。執行如下命令:

$ awk  『』  emp.dat

執行結果時,螢幕出現 :

chenying      21000

linxiyu          23650

…………….

linux/unix命令列上,執行awk 的語法為:$awk  』awk程式』  欲處理的資料檔案檔名;本例中程式部分是。 把程式置於命令行時,程式之前後須以』 括住。emp.dat 為指定給該程式處理的資料檔案檔名。本程式中使用:pattern 語法,但是pattern 部分被省略,表無任何限制條件,所以awk讀入每筆資料行後都將無條件執行這個actions。 print為awk所提供的輸出指令,會將資料輸出到標準輸出stdout(螢幕)。 print 的引數間彼此以」,」 (逗號) 隔開,列印出資料時彼此間會以空白隔開。

如果將上述的程式部分儲存於檔案pay1.awk 中,執行命令時再指定awk 程式檔案的檔名。 這是執行awk 的另一種方式,適用於程式較大的情況, 其語法如下:

$ awk   -f   awk程式檔名  資料檔案檔名 

$ awk -f pay1.awk emp.dat 

awk 中也提供與 c 語言中類似用法的printf()函式,使用該函式可進一步控制資料的輸出格式。編輯另乙個awk程式如下,並取名為pay2.awk  

執行下列命令      

$awk -f  pay2.awk  emp.dat      

執行結果螢幕出現:    

chenying workhours: 100 and pay: 21000

linxiyu workhours: 110 and pay: 23650

degnming workhours: 130 and pay: 27170

liuchao workhours: 125 and pay: 27500

hejing workhours: 95 and pay: 19950

Web API 第二部分

web api 第二部分 元素偏移量 offset element.offsettop element.offsetleft element.offsetwidth 可以得到元素的大小 寬度和高度 是包含padding border width element.offsetheight elemen...

redux 第二部分

redux 的使用方法,為什麼使用 action.js 檔案,進行優化 將其分開,然後我們通過工廠函式的每次返回不同的物件,由於引數是固定的,每次返回的都是事件型別和事件資料,所以我們可以使用乙個函式,通過其返回值來返回乙個物件,讓後傳遞給 action 我們的 reducer 函式有兩個引數,引數...

實驗二 第二部分

第二部分 ftp協議分析 1.兩個同學一組,a和b。2.在a主機上架設ftp伺服器 3.在b主機上執行wireshark,並登陸a主機的ftp伺服器,上傳一張,得到抓取的資料報,4.進行追蹤tcp流,顯示為原始資料,分析得到a主機登陸ftp的過程及使用者名稱密碼,還原上傳的,第二部分 ftp協議分析...