基礎語法:
awk指令的基本格式是:awk [引數]‘awk程式’檔名
其中awk程式的主要結構是:pattern {action}
一般常使用“關係表示式”來當做pattern,例如:$1>4,$2==$3,”banana”~/an/ (
這是一個正則匹配的判斷關係式,若A為字串,B為一個正在表示式,A~B(判斷字串A是否包含能匹配B表示式的子字串);A!~B(判斷字串A是否不包含能匹配B表示式的子字串))
action主要包括一些指令,如awk的i/o指令:print,printf,getline;awk的流程控制指令:if(…){…}else{…}, do{…}while();
awk程式為每個輸入行依次地進行每一個pattern的匹配尋找,對每一個匹配上的模式執行相應的action,接著讀取下一行並再次開始匹配,知道所有的輸入都處理完畢。
在一條語句中可以省略pattern或action,預設的pattern為匹配所有行,預設的動作為輸出當前行。awk從輸入中一次讀取一行(一條記錄),預設的行分隔符為
。然後awk將記錄分隔為一個個的欄位,預設的欄位分隔為空白。一行中的第一個欄位為$1,依次往後$2,$3…,整個記錄為$0。
awk的內建變數,可使用這些變數來取得相關資訊,常見的有:
NF(Number of Fields):為一整數,其值表示$0所包含的欄位數目。
NR(Number of Records):為一整數,其值表示awk已讀入的資料行數目。
FILENAME:正在處理的資料檔名。
更多的請大家參考http://www.jiayii.com/awk-tutorial/
基礎操作舉例:測試檔案test.txt,內容如下:
- 語文 John 105
- 數學 Dan 115
- 語文 Max 130
- 數學 John 125
- 物理 John 100
BEGIN和END
在awk中兩個特別的表單式,可用於pattern中,提供BEGIN和END是給程式賦予初始狀態和在程式結束之後執行一些掃尾工作。任何在BEGIN之後列出的操作將在awk開始掃描輸入之前執行,而END之後列出的操作將在掃描完全部的輸入之後執行。因此,通常使用BEGIN來顯示變數和預設初始值,使用END來輸出最終結果。
還是以上面的檔案舉例:
1。將John的所有成績加和,可用命令如下:
- awk `$2=="John"{total=total+$3}END{print total}` test.txt
- awk `$2=="John"{total=total+$3}END{printf("%d ",total)}` test.txt
2。預設初始成績為60,再將檔案中的成績累加:
- awk `BEGIN{printf("John成績累計:");total=60}$2=="John"{total=total+$3}END{printf("%d ",total)}` test.txt
awk陣列使用
awk陣列使用字串作為陣列的下標;使用時不需要初始化;
實際應用陣列運用也是最廣的,我們還是以test.txt為資料檔案,分別計算各個成員的分數總計:
- awk `{total[$2]=total[$2]+$3}END{for(student in total)printf("%s %d ",student,total[student])}` test.txt
實際應用
在我使用awk的時候,往往是從線上撈取一些統計資料,而使用時往往這些日誌檔案都不是很規則,那你可以做的是,首先通過grep或者其他命令將檔案轉換為一段具有一定規律的輸出,然後再使用awk進行處理。
參考文件:
http://www.aslibra.com/doc/awk.htm
http://www.jiayii.com/awk-tutorial/
http://fanqiang.chinaunix.net/program/other/2005-09-07/3621.shtml