AWK用法簡介

polestar123發表於2009-01-12

AWK用法簡介

AWK 用法簡介

概要

AWKUnix平臺上一種可以對文字進行逐行處理的程式語言,它來源於3個創作者的名字:Aho(Peter)Weinberg(Brain)Kernighan. sedgrep很相似,awk是一種樣式掃描與處理工具,但其功能卻大大強於sedgrepawk提供了極其強大的功能:它幾乎可以完成grepsed所能完成的全部工作,同時,它還可以可以進行樣式裝入、流控制、數學運算子、程式控制語句甚至於內建的變數和函式。awk的三位建立者已將它正式定義為:樣式掃描和處理語言。

AWK的呼叫方式

1). 程式體直接寫到AWK命令列中,適用較簡單的情況

awk 'program' input-file1 input-file2 ...

2). 程式體寫入檔案中,用AWK命令呼叫該檔案

awk -f program-file input-file1 input-file2 ...

3). C shell作為命令解釋程式,呼叫AWK來執行AWK程式,寫成的指令碼

#!/bin/csh -f

awk '

{ print $8, "t", $3}

'

4). AWK作為命令解釋程式,寫成的指令碼

#!/bin/awk -f

{ print $8, "t", $3}

AWK的引數說明
awk [ -F re] [parameter...] ['prog'] [-f progfile][in_file...]
引數說明:
-F re:
允許awk更改其欄位分隔符。
parameter:
該引數幫助為不同的變數賦值。
'prog': awk
的程式語句段。必須用單引號:''括起,以防被shell解釋。

這個程式語句段的標準形式為: 'pattern {action}'
(1) pattern
引數是匹配模式,跟Sed命令類似。
(2) action
引數總是被大括號包圍,由一系統awk語句組成,各語句間用";"分隔。
awk
pattern給定的樣式匹配記錄上執行其操作。 使用#作為註釋符。
(3)
可以省略patternaction之一,但不能兩者同時省略,當省略pattern時沒
有樣式匹配,表示對所有行(記錄)均執行操作,省略action時執行預設的操在標準輸出上顯示。
(4) 可以包含多個pattern {action},如果一個記錄滿足多個pattern,其對應的action會被執行多次

-f progfile:
允許awk呼叫執行程式檔案。progfile是一文字檔案,必須符合awk語法。
in_file: awk
的輸入檔案,awk允許對多個輸入檔案進行處理。
*awk
不修改輸入檔案。如果未指定輸入檔案,awk將接受標準輸入,並將結果顯示在標準輸出上。awk支援輸入輸出重定向。(跟SED類似)

AWK的記錄(Record)與欄位(Field)

awk處理的工作與資料庫的處理方式有相同之處,其相同處之一就是awk支援對記錄和欄位的處理,其中對欄位的處理是grepsed不能實現的。在awk中,預設的情況下總是將文字檔案中的一行視為一個記錄,而將一行中的某一部分作為記錄中的一個欄位。為了操作這些不同的欄位,awk借用shell的方法,用$1,$2,$3...這樣的方式來順序地表示行(記錄)中的不同欄位。特殊地,awk$0表示整個行(記錄)。不同的欄位之間是用稱作分隔符的字元分隔開的。系統預設的分隔符是空格。awk允許在命令列中用-F re的形式來改變這個分隔符。事實上,awk用一個內建的變數FS來記憶這個分隔符,可以在程式中進行修改。

AWK的運算,判斷與賦值
運算

運算子 用途
------------------
x^y x
y次冪
x**y
同上
x%y
計算x/y的餘數(求模)
x+y x
y
x-y x
y
x*y x
y
x/y x
y
-y
y(y的開關符號);也稱一目減
++y y
1後使用y(前置加)
y++
使用y值後加1(字尾加)
--y y
1後使用y(前置減)
y--
使用後y1(字尾減)
x=y
y的值賦給x
x+=y
x+y的值賦給x
x-=y
x-y的值賦給x
x*=y
x*y的值賦給x
x/=y
x/y的值賦給x x%=y x%y的值賦給x
x^=y
x^y的值賦給x
x**=y
x**y的值賦給x

判斷:
運算子 含義
x==y x
等於y
x!=y x
不等於y
x>y x
大於y
x>=y x
大於或等於y
x
小於y
x<=y x
小於或等於y?
x~re x
匹配正規表示式re?
x!~re x
不匹配正規表示式re?

賦值 (按優先順序升序排列)
=
+= -= *= /= %=
||

&&
> >= < <= == != ~ !~
xy (
字串連結,'x''y'變成"xy"
+ -
* / %
++ - -

AWK的流程控制

1BEGINEND:
awk中兩個特別的表示式,BEGINEND,這兩者都可用於pattern中,提供BEGINEND的作用是給程式賦予初始狀態和在程式結束之後執行一些掃尾的工作。任何在BEGIN之後列出的操作(在{}內)將在awk開始掃描輸入之前執行,而END之後列出的操作將在掃描完所有輸入之後執行。因此,通常用BEGIN來顯示變數和預置(初始化)變數,用END來輸出最終結果。 例:累計銷售檔案xs中的銷售金額(假設銷售金額在記錄的第三欄位):
$awk
>'BEGIN { FS=":";print "
統計銷售金額";total=0}
>{print $3;total=total+$3;}
>END {printf "
銷售金額總計:%.2f",total}' sx
>
shell提供的第二提示符,如要在shell程式awk語句和awk語言中換行,在行尾加反斜槓
在這裡,BEGIN預置了內部變數FS(欄位分隔符)和自定義變數total,同時在掃描之前顯示出輸出行頭。而END則在掃描完成後列印出總合計。
2
、流程控制語句


2.1
if...else語句:
if(
表示式)
語句1
else
語句2
格式中"語句1"可以是多個語句,如果你為了方便awk判斷也方便你自已閱讀,你最好將多個語句用{}括起來。awk分枝結構允許巢狀。
2.2
while語句
while(
表示式語句
2.3
do-while語句
do
{
語句
}while(
條件判斷語句)
2.4
for語句
for(
初始表示式;終止條件;步長表示式)
{
語句}

while
do-whilefor語句中允許使用break, continueexit來控制程式走向。

Break:中斷當前正在執行的迴圈並跳到迴圈外執行下一條語句。

Continue:從當前位置跳到迴圈開始處執行。

Exit:當exit語句不在END中時,該命令表現得如同到了檔案尾,所有模式或操作將停止,END模式中的操作被執行。而出現在END中的exit將導致程式終止。

AWK的變數
awk提供兩種變數,一種是awk內建的變數,在awk程式中引用內建變數不需要使用標誌符"$"awk提供的另一種變數是自定義變數。當然這種變數不能與內建變數及其它awk保留字相同,在awk中引用自定義變數必須在它前面加上標誌符"$"。與C語言不同的是,awk中不需要對變數進行初始化,awk根據其在awk中第一次出現的形式和上下文確定其具體的資料型別。當變數型別不確定時,awk預設其為字串型別。這裡有一個技巧:如果你要讓你的awk程式知道你所使用的變數的明確型別,你應當在在程式中給它賦初值。

AWK中的函式
AWK的函式同樣包括內建函式和使用者自定義的函式。原始的awk不提供函式功能,只有在nawk或較新的awk版本中才可以增加函式。
函式的使用包含兩部分:函式的定義與函式呼叫。其中函式定義又包括要執行的程式碼(函式本身)和從主程式程式碼傳遞到該函式的臨時呼叫。
awk
函式的定義方法如下:
function
函式名(參數列){
函式體
}
函式名必須是一個合法的標誌符,參數列中可以不提供引數(但在呼叫函式時函式名後的一對括號仍然是不可缺少的),也可以提供一個或多個引數。awk的引數也是透過值來傳遞的。

awk中呼叫函式比較簡單,其方法與C語言相似,但awkC語言更為靈活,它不執行引數有效性檢查。換句話說,在你呼叫函式時,可以列出比函式預計(函式定義中規定)的多或少的引數,多餘的引數會被awk所忽略,而不足的引數,awk將它們置為預設值0或空字串,具體置為何值,將取決於引數的使用方式。
awk
函式有兩種返回方式:隱式返回和顯式返回。當awk執行到函式的結尾時,它自動地返回到呼叫程式,這是函式是隱式返回的。如果需要在結束之前退出函式,可以明確地使用返回語句提前退出。方法是在函式中使用形如:return 返回值 格式的語句。

例:下面的例子演示了函式的使用。
nawk
>'BEGIN{pageno=1;file=FILENAME
>pageno=print_header(file
pageno)span lang="EN-US" style="">#呼叫函式print_header
>printf("
當前頁頁號是:%dn",pageno);
}

#
定義函式print_header
function print_header(FileName,PageNum){
printf("%s %dn",FileName,PageNum); >PageNum++;return PageNUm;
}
}' myfile

AWK的內建變數(預定義變數)
說明:表中v項表示第一個支援變數的工具:A=awkN=nawk,P=POSIX awk,G=gawk
V
變數 含義 預設值
--------------------------------------------------------
N ARGC
命令列引數個數
G ARGIND
當前被處理檔案的ARGV標誌符
N ARGV
命令列引數陣列
G CONVFMT
數字轉換格式 %.6g
P ENVIRON UNIX
環境變數
N ERRNO UNIX
系統錯誤訊息
G FIELDWIDTHS
輸入欄位寬度的空白分隔字串
A FILENAME
當前輸入檔案的名字
P FNR
當前記錄數
A FS
輸入欄位分隔符 空格
G IGNORECASE
控制大小寫敏感0(大小寫敏感)
A NF
當前記錄中的欄位個數
A NR
已經讀出的記錄數
A OFMT
數字的輸出格式 %.6g
A OFS
輸出欄位分隔符 空格
A ORS
輸出的記錄分隔符 新行
A RS
輸入的記錄他隔符 新行
N RSTART
被匹配函式匹配的字串首
N RLENGTH
被匹配函式匹配的字串長度
N SUBSEP
下標分隔符 "34"

AWK
的內建函式
V
函式 用途或返回值
------------------------------------------------
N gsub(reg,string,target)
每次常規表示式reg匹配時替換target中的string
N index(search,string)
返回stringsearch串的位置
A length(string)
求串string中的字元個數
N match(string,reg)
返回常規表示式reg匹配的string中的位置
N printf(format,variable)
格式化輸出,按format提供的格式輸出變數variable
N split(string,store,delim)
根據分界符delim,分解stringstore的陣列元素
N sprintf(format,variable)
返回包含基於format的格式化資料,variables是要放到串中的資料
G strftime(format,timestamp)
返回format日期或時間串,timestmpsystime()函式返回的時間
N sub(reg,string,target)
第一次當常規表示式reg匹配,替換target串中的字串
A substr(string,position,len)
返回一個以position開始len個字元的子串
P totower(string)
返回string中對應的小寫字元
P toupper(string)
返回string中對應的大寫字元
A atan(x,y) x
的餘切(弧度)
N cos(x) x
的餘弦(弧度)
A exp(x) e
x
A int(x) x
的整數部分
A log(x) x
的自然對數值
N rand() 0-1
之間的隨機數
N sin(x) x
的正弦(弧度)
A sqrt(x) x
的平方根
A srand(x)
初始化隨機數發生器。如果忽略x,則使用system()
G system()
返回自197011日以來經過的時間(按秒計算)

一些例子:
1. 列印11月被修改的檔案的位元組數
ls –lg | awk ‘$6 == “NOV” {sum += $5} END {print sum}’

2. 檔案result中包含FAILED的行數
awk ‘/FAILED/ {sum += 1} END {print sum}’ result

3. 列印file檔案最長行的長度
awk ‘if (length($0) > max) max = length($0)} END {print max}’ file

4. 輸出file檔案的行數
awk ‘END {print NR} file

NR是內建變數,表示已經讀出的記錄數,在END後輸出即是總行數
用cat file | wc –l 命令組合可以完成同樣的功能
[@more@]

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

相關文章