基礎語法:

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,內容如下:

  1. 語文   John 105 
  2. 數學      Dan 115 
  3. 語文      Max 130 
  4. 數學     John 125 
  5. 物理    John 100 
(請注意裡面的空白有可能是空白,也可能是tab)
1。獲取所有John的成績單,可以用這些命令:
awk `/John/` test.txt(action預設輸出整行)
awk `/John/{print $0}` test.txt
awk `$2==”John”{print $0}` test.txt(預設以空白為分隔,$2既代表每行的第二個域)
awk `$2~/John/{print $0}` test.txt($2和正規表示式/John/匹配)
2。獲取成績大於120的成績單
awk `$3>=120` test.txt
3。如果原資料檔案是以“,”分隔的,那麼所有的語句都可以增加分隔引數,如:awk -F”,” /John/` test.txt(這就是-F的作用)

 

 

BEGIN和END

在awk中兩個特別的表單式,可用於pattern中,提供BEGIN和END是給程式賦予初始狀態和在程式結束之後執行一些掃尾工作。任何在BEGIN之後列出的操作將在awk開始掃描輸入之前執行,而END之後列出的操作將在掃描完全部的輸入之後執行。因此,通常使用BEGIN來顯示變數和預設初始值,使用END來輸出最終結果。

還是以上面的檔案舉例:

1。將John的所有成績加和,可用命令如下:

  1. awk `$2=="John"{total=total+$3}END{print total}` test.txt 
  2.  
  3. awk `$2=="John"{total=total+$3}END{printf("%d ",total)}` test.txt 

2。預設初始成績為60,再將檔案中的成績累加:

  1. awk `BEGIN{printf("John成績累計:");total=60}$2=="John"{total=total+$3}END{printf("%d ",total)}` test.txt 

 

awk陣列使用

awk陣列使用字串作為陣列的下標;使用時不需要初始化;

實際應用陣列運用也是最廣的,我們還是以test.txt為資料檔案,分別計算各個成員的分數總計:

  1. 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