awk的內部變數的個數不多,在這裡介紹的時候就不按照字母順序排列了,而是按相關性分類說明。
argc
argc表示命令行上除了選項-f,-v,-f等選項及其所對應的引數之外的所有引數的個數。如果將「awk程式」直接寫在命令列上,那麼argc是不會把「awk程式」計算在內的。
argv
argv是乙個資料,用來記錄命令列上的引數的名稱。 執行下列命令:
[root@myfreelinux pub]# awk 『begin』 inte integer
argc=3
argv[0]=awk
argv[1]=inte
argv[2]=integer
需要注意當argc = 3 時,命令列上只指定了2 個檔案。
awk的引數-f/t 表示以tab 為字段分隔字元fs(field seporator);-v a=8 是用以初始化程式中的變數。
filename
filename用來表示目前正在處理的檔名。
fs域分隔字元
$0 表示目前awk所讀入的資料行的內容,$1,$2…示所讀入的資料行經過fs指定分割符分割後的第一域,第二域…的記過。
說明:當awk讀入一行資料行」a123 8:15″ 時,會先以$0 記錄,即$0 = 「a123 8:15″,如果程式中進一步使用了$1,$2…或 nf等內部變數時,awk才會自動分割 $0,以便取得各域的資料。 切割後各個域的資料會分別用$1,$2, $3…等儲存。
awk預設的(default)域分隔字元(fs)為空白字元(空格及tab)。以上例來說,如果沒有改變fs的值,那麼分割後:第乙個域($1)=」a123″,第二個域($2)=」8:15″。也可以使用正規表示式來定義fs,比如fs=/[ /t:]+/,表示0或多個空格、tab、:分別或他們三個任意組合成的字串作為分割符,awk每次需要分割資料行時,就會參考目前fs的值。 那麼這定fs後,$0 = 「a123 8:15″,將被分割為,第乙個域($1) = 「a123″,第二個域($2) = 「8″,第三個域($3) = 「15″。
nr (number record)
nr表示awk 開始執行該程式後所讀取的資料行數。
fnr (file number record)
fnr 與nr功用類似;不同的是awk在處理多個資料檔案的時候,每開啟乙個新的檔案,fnr便從0重新累計,而nr是一直累加,看個列子更直觀些,見下列:
[root@myfreelinux pub]# cat inte
123324
[root@myfreelinux pub]# cat integer
222 111
333 111
444 111
[root@myfreelinux pub]# awk 『begin』 inte integer
0 0[root@myfreelinux pub]# awk 『』 inte integer
1 1 123
2 2 324
3 1 222 111
4 2 333 111
5 36 4 444 111
nf(number field)
nf表示當前行被域分隔符分割成的域的個數。awk 每讀入一筆資料後,在程式中用nf記錄該行資料報含的域的個數。在下一行資料被讀入之前,nf不會改變。但如果使用$0來記錄資料,例如:使用getline,此時nf將代表新的$0上資料的域的個數。
ofs (output file separate)
ofs輸出域分隔字元。預設是」 「(乙個空白)
ors(output record separate)
ors輸出資料行分隔字元。預設值是」/n」(換行符)。
ofmt(output format)
ofmt數值資料的輸出格式。預設值」%.6g」(若須要時最多印出6位小數)。
當使用print指令一次列印出多項資料時,例如:print $1,$2,輸出時,awk會自動在$1與$2之間補上乙個域分隔符的值(ofs 之值);每次使用print輸出後,awk會自動補上h行分隔符的值(ors 之值)。使用print 輸出數值資料時,awk將採用 ofmt 之值為輸出格式。例如:
[root@myfreelinux pub]# awk 『begin』
0.666667
0.67:1
程式中通過改變ofs和ofmt的值,改變了指令print的輸出格式。
rs
rs( record separator) :awk從檔案上讀取資料時,將根據rs的定義把資料切割成許多records,awk一次唯讀入乙個record進行處理。rs 的預設值是換行符」/n」,所以一般awk一次僅讀入一行資料。有時乙個record含括了幾行資料(multi-line record),這情況下不能再以」/n」 來分隔相鄰的records,可改用空白行來分隔,即令rs = 「」,表示以空白行來分隔相鄰的records。
rstart
rstart與使用字串函式match( )有關的變數,是匹配的字元的開始的位置。
rlength
rlength與使用字串函式match( )有關的變數,rlength是匹配的字串的長度。當使用match() 函式後,awk會將match() 執行的結果以rstart和rlength記錄。看下面的例子:
[root@myfreelinux pub]# awk 『begin』
2 2[root@myfreelinux pub]# awk 『begin』
2 4[root@myfreelinux pub]# awk 『begin』
3 4subsep
subsep(subscript separator) 陣列下標的分隔字元,預設值為」/034″實際上,awk中的陣列只接受字串當它的下標,比如: arr["john"]。但awk中仍然可使用數字當陣列的下標,甚至可使用多維的陣列(multi-dimenisional array),比 如:arr[2,20]。事實上,awk在接受arr[2,20]之前,就已先把其下標轉換成字串」2/03420″,之後便以arr["2/03420"] 代替arr[2,20]。可參考下例:
[root@myfreelinux pub]# awk 『begin』
1313
13再看下面這個例子,統計每門課有幾個學生選修,用課程名稱作為陣列的下標:
[root@myfreelinux pub]# cat kecheng.dat
zhangsan math english chinese
lisi computer chinese english
wangwu dianzi chinese math
zhaoliu huanjing english chinese
[root@myfreelinux pub]# cat kecheng.awk
#!/bin/awk -f
end[root@myfreelinux pub]# awk -f kecheng.awk kecheng.dat
computer 1
english 3
dianzi 1
chinese 4
math 2
huanjing 1
awk的使用 第十三部分 awk的字串和數學函式
awk 的內建函式 built in functions 一 字串函式 語法 index 原字串,尋找的子字串 解釋 若原字串中含有欲找尋的子字串,則返回該子字串在原字串中第一次出現的位置,如果沒有出現該子字串則返回0。例如執行 root myfreelinux pub awk begin 5 是返...
awk的使用 第十一部分 awk中常用的模式
awk 通過判斷模式 pattern 的值來決定是否執行其後對應的動作 actions 首先來看一下awk中幾個常見的模式,在前十部分中,有一些模式已經做了介紹,在這裡再總結一下 1 begin是awk 的保留字,是一種特殊的模式。begin 成立 其值為true 的時機是 awk 程式一開始執行,...
awk的使用 第十三部分 awk的字串和數學函式
awk 的內建函式 built in functions 一 字串函式 語法 index 原字串,尋找的子字串 解釋 若原字串中含有欲找尋的子字串,則返回該子字串在原字串中第一次出現的位置,如果沒有出現該子字串則返回0。例如執行 root myfreelinux pub awk begin 5 是返...