亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 8007 | 回復(fù): 4
打印 上一主題 下一主題

gawk的使用方法  關(guān)閉 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2004-03-24 21:25 |只看該作者 |倒序?yàn)g覽
gawk的使用方法



本文出自: 作者: (2002-03-02 14:01:59)
第一章    前言 
第二章    簡(jiǎn)介 
第三章    讀取輸入檔案 
第四章    印出 
第五章    Patterns 
第六章    算式(Expression)作為Actions的敘述 
第七章    Actions里面的控制敘述 
第八章    內(nèi)建函式(Built-in Functions) 
第九章    使用者定義的函式 
第十章    □例 
第十一章  結(jié)論 
 
 
 
======================================= 
 
第一章 前言
awk是一個(gè)程式語(yǔ)言,對(duì)於資料的處理具有很強(qiáng)的功能。對(duì)於文 字檔里的資料做
修改、比對(duì)、抽取等的處理,awk 能夠以很短的程式 輕易地完成。如果使用 C
或 Pascal 等語(yǔ)言寫程式完成上述的動(dòng)作, 會(huì)不方便且很花費(fèi)時(shí)間,所寫的程
式也會(huì)很大。
awk 能夠依照使用者的定義格式來(lái)分解輸入資料,也可依照使用 者定義的格式
來(lái)印出資料。 awk 名稱的由來(lái)是由它的原始設(shè)計(jì)者的姓氏之第一個(gè)字母而命
名 :Alfred V. Aho, Peter J. Weinberger, Brian W. Kernighan。
awk最初在1977年完成。一個(gè)新版本的awk在1985年被發(fā)表,它的功能 比舊版本
增強(qiáng)不少。 gawk 是GNU所做的 awk,gawk 最初在1986年完成,之後不斷地 被
改進(jìn)、更新。gawk 包含 awk 的所有功能。 往後的 gawk 將以下面的2個(gè)輸入檔
案來(lái)做例子說(shuō)明。
檔案'BBS-list':
aardvark 555-5553 1200/300 B
alpo-net 555-3412 2400/1200/300 A
barfly 555-7685 1200/300 A
bites 555-1675 2400/1200/300 A
camelot 555-0542 300 C
core 555-2912 1200/300 C
fooey 555-1234 2400/1200/300 B
foot 555-6699 1200/300 B
macfoo 555-6480 1200/300 A
sdace 555-3430 2400/1200/300 A
sabafoo 555-2127 1200/300 C
檔案'shipped':
Jan 13 25 15 115
Feb 15 32 24 226
Mar 15 24 34 228
Apr 31 52 63 420
May 16 34 29 208 J
un 31 42 75 492
Jul 24 34 67 436
Aug 15 34 47 316
Sep 13 55 37 277
Oct 29 54 68 525
Nov 20 87 82 577
Dec 17 35 61 401
Jan 21 36 64 620
Feb 26 58 80 652
Mar 24 75 70 495
Apr 21 70 74 514

 
 
 
第二章 簡(jiǎn)介

gawk 的主要功能是針對(duì)檔案的每一行(line)搜尋指定的 patterns
。當(dāng)一行里有符合指定的 patterns,gawk 就會(huì)在此一行執(zhí)行被指定
的 actions。 gawk 依此方式處理輸入檔案的每一行直到輸入檔案結(jié)
束。

gawk 程式是由很多的 pattern 與 action 所組成,action 寫在
大括號(hào) { } 里面,一個(gè)pattern後面就跟著一個(gè)action。整個(gè) gawk 程
式會(huì)像下面的樣子:

pattern {action}
pattern {action}

在 gawk 程式里面的規(guī)則,pattern 或 action 能夠被省略,但
是兩個(gè)不能同時(shí)被省略。如果 pattern 被省略,對(duì)於輸入檔里面的
每一行,action 都會(huì)被執(zhí)行。如果 action 被省略,內(nèi)定的 action
則會(huì)印出所有符合 pattern 的輸入行。



2.1 如何執(zhí)行g(shù)awk程式

基本上,有2個(gè)方法可以執(zhí)行g(shù)awk程式。

□如果 gawk 程式很短,則 gawk 可以直接寫在 command line,如下所示:

gawk 'program' input-file1 input-file2 ...

其中 program 包括一些 pattern 和 action。

□如果 gawk 程式較長(zhǎng),較為方便的做法是將 gawk 程式存在一個(gè)檔案,
即 patterns 與 actions 寫在檔名為 program-file 的檔案里面,執(zhí)行
gawk 的格式如下所示:

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

gawk 程式的檔案不止一個(gè)時(shí),執(zhí)行g(shù)awk 的格式如下所示:

gawk -f program-file1 -f program-file2 ... input-file1
input-file2 ...



2.2 一個(gè)簡(jiǎn)單的例子

現(xiàn)在我們舉一個(gè)簡(jiǎn)單的例子,因?yàn)?gawk 程式很短,所以將 gawk 程
式直接寫在 command line。

gawk '/foo/ {print $0}' BBS-list

實(shí)際的 gawk 程式為 /foo/ {print $0}。/foo/ 為 pattern,意思為搜
尋輸入檔里的每一行是否含有子字串 'foo',如果含有 'foo' 則執(zhí)行 action。
action 為 print $0,是將現(xiàn)在這一行的內(nèi)容印出。BBS-list 是輸入的檔案。

執(zhí)行完上述指令後,會(huì)印出下面的結(jié)果:
fooey 555-1234 2400/1200/300 B
foot 555-6699 1200/300 B
macfoo 555-6480 1200/300 A
sabafoo 555-2127 1200/300 C



2.3 一個(gè)較復(fù)雜的例子

gawk '$1 == "Feb" {sum=$2+$3} END {print sum}' shipped

現(xiàn)在這個(gè)例子會(huì)將輸入檔 'shipped' 的第一個(gè)欄位與 "Feb" 做比較
,如果相等,則其對(duì)應(yīng)的第2欄位與第3欄位的值會(huì)被加到變數(shù) sum。
對(duì)於輸入檔的每一行重復(fù)上述的動(dòng)作,直到輸入檔的每一行都被處理
過(guò)為止。最後將 sum 的值印出。END {print sum} 的意思為在所有的輸
入讀完之後,執(zhí)行一次 print sum 的動(dòng)作,也就是把 sum 的值印出。

下面是執(zhí)行的結(jié)果:
84


                                                             
第三章 讀取輸入檔案

gawk的輸入可以從標(biāo)準(zhǔn)輸入或指定的檔案里讀取。輸入的讀取單
位被稱為”記錄”(records),gawk 在做處理時(shí),是一個(gè)記錄一個(gè)記 (p9 of 46)
錄地處理。每個(gè)記錄的內(nèi)定值是一行(line),一個(gè)記錄又被分為多個(gè)
欄位(fields)。



3.1 如何將輸入分解成記錄(records)

gawk 語(yǔ)言會(huì)把輸入分解成記錄(record)。記錄與記錄之間是以
record separator 隔開,record separator 的內(nèi)定值是表示新一行的
字元(newline character),因此內(nèi)定的 record separator 使得文字
的每一行是一個(gè)記錄。

record separator 隨著內(nèi)建變數(shù) RS 的改變而改變。RS 是一個(gè)字串,
它的內(nèi)定值是" "。僅有 RS 的第一個(gè)字元是有效的,它被當(dāng)作 record
separator,而 RS 的其它字元會(huì)被忽略。

內(nèi)建變數(shù) FNR 會(huì)儲(chǔ)存目前的輸入檔案已頸歡寥〉募鍬賈?鍪?D
建變數(shù) NR 會(huì)儲(chǔ)存目前為止所有的輸入檔案已頸歡寥〉募鍬賈?鍪?

3.2 欄位(field)

gawk 會(huì)自動(dòng)將每個(gè)記錄分解成多個(gè)欄位 (field)。類似於字在一
行里面,gawk 的內(nèi)定動(dòng)作會(huì)認(rèn)為欄位之間是以 whitespace 分開。在
gawk 里,whitespace 的意思是一個(gè)或多個(gè)空白或 tabs。

在 gawk 程式里面,以'$1'表示第一個(gè)欄位,'$2'表示第二個(gè)欄位
,依此類推。舉個(gè)例子,假設(shè)輸入的一行如下所示:

This seems like a pretty nice example.

第一個(gè)欄位或 $1 是'This',第二個(gè)欄位或 $2 是 'seems',依此類推。
有個(gè)地方值得特別注意,第七個(gè)欄位或 $7 是'example.'而非'example'。

不論有多少欄位,$NF 可用來(lái)表示一個(gè)記錄的最後一個(gè)欄位。以
上面的例子為例,$NF 與 $7 相同,也就是'example.'。

NF 是一個(gè)內(nèi)建變數(shù),它的值表示目前這個(gè)記錄之欄位的個(gè)數(shù)。 $0,看起來(lái)好像是第零個(gè)欄位,它是一個(gè)特例,它表示整個(gè)記錄。

下面是一個(gè)較復(fù)雜的例子:

gawk '$1~/foo/ {print $0}' BBS-list

結(jié)果如下:
fooey 555-1234 2400/1200/300 B
foot 555-6699 1200/300 B
macfoo 555-6480 1200/300 A
sabafoo 555-2127 1200/300 C

這個(gè)例子是把輸入檔'BBS-list'的每個(gè)記錄的第一個(gè)欄位作檢查,如
果它含有子字串'foo',則這一個(gè)記錄會(huì)被印出。



3.3 如何將記錄分解成欄位

gawk 根據(jù) field separator 將一個(gè)記錄分解成欄位。field sepa- rator 以內(nèi)建變數(shù) FS 表示。

舉個(gè)例子,假如 field separator 是'oo',則下面的行:

moo goo gai pan

會(huì)被分成三個(gè)欄位:'m'、' g'、' gai pan'。

在 gawk 程式里,可以使用'='來(lái)改變 FS 的值。例如:

gawk 'BEGIN {FS=","}; {print $2}'

輸入行如下:

John Q. Smith, 29 Oak St., Walamazoo, MI 42139

執(zhí)行g(shù)awk的結(jié)果將印出字串 ' 29 Oak St.'。BEGIN 後面的 action 會(huì)在
第一個(gè)記錄被讀取之前執(zhí)行一次。

                                                                                
第四章 印出

在gawk程式里,actions 最常做的事就是印出(printing)。簡(jiǎn)單
的印出,使用 printe敘述。復(fù)雜格式的印出,使用 printf 敘述。



4.1 print敘述

print 敘述用在簡(jiǎn)單、標(biāo)準(zhǔn)的輸出格式。敘述的格式如下所示:

print item1, item2, ...

輸出時(shí),各個(gè) item 之間會(huì)以一個(gè)空白分開,最後會(huì)換行(newline)。

如果 'print'敘述之後沒(méi)有跟著任何東西,它與'print $0'的效
果一樣,它會(huì)印出現(xiàn)在的記錄(record)。要印出空白行可使用'print
""'。 印出一段固定的文字,可用雙引號(hào)將文字的兩邊括起來(lái),例如
'print "Hello there"'。
這里是一個(gè)例子,它會(huì)把每個(gè)輸入記錄的前二個(gè)欄位印出:

gawk '{print $1,$2}' shipped

結(jié)果如下所示:
Jan 13
Feb 15
Mar 15
Apr 31
May 16
Jun 31
Jul 24
Aug 15
Sep 13
Oct 29
Nov 20
Dec 17

Feb 26
Mar 24
Apr 21



4.2 Output Separators

前面我們已提過(guò)如果 print 敘述包含有多個(gè) item,item 之間
用逗點(diǎn)分開,則印出時(shí)各個(gè)item會(huì)被一個(gè)空白隔開。你能夠使用任何
的字串作為 output field separator,可以居贍誚ū涫?OFS 的設(shè)
定來(lái)更改 output field separator。OFS 的初始值為" ",即一格的
空白。

整個(gè) print 敘述的輸出被稱為 output record。print 敘述輸
出 output record 之後,會(huì)接著輸出一個(gè)字串,此字串稱為 output
record separator。內(nèi)建變數(shù) ORS 用來(lái)指明此字串。ORS 的初始值
為 " ",也就是換行。

下面這個(gè)例子會(huì)印出每個(gè)記錄的第一個(gè)欄位和第二個(gè)欄位,此二
(p16 of 46)
個(gè)欄位之間以分號(hào)';'分開,每行輸出之後會(huì)加入一個(gè)空白行。

gawk 'BEGIN {OFS=";"; ORS=" "} {print $1, $2}' BBS-list

結(jié)果如下所示:
aardvark;555-5553

alpo-net;555-3412

barfly;555-7685

bites;555-1675

camelot;555-0542

core;555-2912

fooey;555-1234

foot;555-6699

macfoo;555-6480

sdace;555-3430

sabafoo;555-2127




4.3 printf敘述

printf 敘述會(huì)使得輸出格式較容易精確地控制。printf 敘述可以
指定每個(gè) item 印出的寬度,也可以指定數(shù)字的各種型式。

printf 敘述的格式如下:

printf format, item1, item2, ...

print 與 printf 的差別是在於 format, printf 的引數(shù)比 print
(p18 of
多了字串 format。format 的型式與 ANSI C 的 printf 之格式相同。

printf 并不會(huì)做自動(dòng)換行的動(dòng)作。內(nèi)建變數(shù) OFS 與 ORS 對(duì) printf 敘
述沒(méi)有任何影響。

格式的指定以字元'%'開始,後面接著格式控制字母。

格式控制字母如下所示:

'c' 將數(shù)字以 ASCII 字元印出。
例如'printf "%C",65'會(huì)印出字元'A'。

'd' 印出十進(jìn)位的整數(shù)。

'i' 印出十進(jìn)位的整數(shù)。

'e' 將數(shù)字以科學(xué)符號(hào)的形式印出。
例如

print "$4.3e",1950
(p19 of

結(jié)果會(huì)印出'1.950e+03'。

'f' 將數(shù)字以浮點(diǎn)的形式印出。

'g' 將數(shù)字以科學(xué)符號(hào)的形式或浮點(diǎn)的形式印出。數(shù)字的絕對(duì)值如果
大於等於0.0001則以浮點(diǎn)的形式印出,否則以科學(xué)符號(hào)的形式印
出。

'o' 印出無(wú)號(hào)的八進(jìn)位整數(shù)。

's' 印出一個(gè)字串。

'x' 印出無(wú)號(hào)的十六進(jìn)位整數(shù)。10至15以'a'至'f'表示。

'X' 印出無(wú)號(hào)的十六進(jìn)位整數(shù)。10至15以'A'至'F"表示。

'%' 它并不是真正的格式控制字母,'%%"將印出"%'。

在 % 與格式控制字母之間可加入 modifier,modifier 是用來(lái)進(jìn)一
步控制輸出的格式?赡艿 modifier 如下所示:

'-' 使用在 width 之前,指明是向左靠齊。如果'-'沒(méi)有出現(xiàn),則會(huì)在
被指定的寬度向右靠齊。例如:

printf "%-4S", "foo"

會(huì)印出'foo '。

'width' 這一個(gè)數(shù)字指示相對(duì)應(yīng)的欄位印出時(shí)的寬度。例如:

printf "%4s","foo"

會(huì)印出' foo'。

width 的值是一個(gè)最小寬度而非最大寬度。如果一個(gè) item 的
值需要的寬度比 width 大,則不受 width 的影響。例如

printf "%4s","foobar"
將印出'foobar'。

'.prec' 此數(shù)字指定印出時(shí)的精確度。它指定小數(shù)點(diǎn)右邊的位數(shù)。如
果是要印出一個(gè)字串,它指定此字串最多會(huì)被印出多少個(gè)字
元。

                                        
                                                                       
第五章 patterns
在 gawk 程式里面,當(dāng) pattern 符合現(xiàn)在的輸入記錄(record),其
相對(duì)應(yīng)的 action 才會(huì)被執(zhí)行。



5.1 Pattern的種類

這里對(duì) gawk 的各種 pattern 型式作一整理:

/regular expression/
(p22 of
一個(gè) regular expression 當(dāng)作一個(gè) pattern。每當(dāng)輸入記錄 (
record)含有 regular expression 就視為符合。

expression
一個(gè)單一的 expression。當(dāng)一個(gè)值不為 0 或一個(gè)字串不是空的,
則可視為符合。

pat1,pat2
一對(duì)的 patterns 以逗號(hào)分開,指定記錄的□圍。

BEGIN
END
這是特別的 pattern, gawk 在開始執(zhí)行或要結(jié)束時(shí)會(huì)分別執(zhí)行相
對(duì)應(yīng)於BEGIN或END的 action。

null
這是一個(gè)空的pattern,對(duì)於每個(gè)輸入記錄皆視為符合pattern。

(p23 of
5.2 Regular Expressions當(dāng)作Patterns

一個(gè) regular expression 可簡(jiǎn)寫為 regexp,是一種描述字串的方
法。一個(gè) regular expression 以斜線('/')包圍當(dāng)作 gawk 的 pattern。

如果輸入記錄含有 regexp 就視為符合。例如:pattern 為 /foo/,
對(duì)於任何輸入記錄含有'foo'則視為符合。

下面的例子會(huì)將含有'foo'的輸入記錄之第2個(gè)欄位印出。

gawk '/foo/ {print $2}'' BBS-list

結(jié)果如下:
555-1234
555-6699
555-6480
555-2127

regexp 也能使用在比較的算式。

(p24 of
exp ~ /regexp/
如果 exp 符合 regexp,則結(jié)果為真(true)。

exp !~ /regexp/
如果 exp 不符合 regexp,則結(jié)果為真。



5.3 比較的算式當(dāng)作Patterns

比較的 pattern 用來(lái)測(cè)試兩個(gè)數(shù)字或字串的關(guān)系諸如大於、等於
、小於。下面列出一些比較的pattern:

x x<=y 如果 x 小於、等於 y,則結(jié)果為真。
x>y 如果 x 大於 y,則結(jié)果為真。
x>=y 如果 x 大於、等於 y,則結(jié)果為真。
x==y 如果 x 等於 y,則結(jié)果為真。
x!=y 如果 x 不等於 y,則結(jié)果為真。
x~y 如果 x 符合 regular expression y,則結(jié)果為真。
(p25 of
x!~y 如果 x 不符合 regular expression y,則結(jié)果為真。

上面所提到的 x 與 y,如果二者皆是數(shù)字則視為數(shù)字之間的比較,
否則它們會(huì)被轉(zhuǎn)換成字串且以字串的形式做比較。兩個(gè)字串的比較,
會(huì)先比較第一個(gè)字元,然後比較第二個(gè)字元,依此類推,直到有不同
的地方出現(xiàn)為止。如果兩個(gè)字串在較短的一個(gè)結(jié)束之前是相等,則視
為長(zhǎng)的字串比短的字串大。例如 "10" 比 "9" 小,"abc" 比 "abcd" 小。



5.4 使用布林運(yùn)算的Patterns

一個(gè)布林(boolean) pattern 是使用布林運(yùn)算"或"(),"及"
(''&&'),"反"('!')來(lái)組合其它的pattern。
例如:

gawk '/2400/ && /foo/' BBS-list
gawk '/2400/ || /foo/' BBS-list
gawk '! /foo/' BBS-list

第六章 算式(Expression)作為Actions的敘述

算式(Expression) 是gawk程式里面action的基本構(gòu)成者。



6.1 算術(shù)運(yùn)算

gawk 里的算術(shù)運(yùn)算如下所示:

x+y 加
x-y 減
-x 負(fù)
+x 正。實(shí)際上沒(méi)有任何影響。
x*y 乘
x/y 除
x%y 求馀數(shù)。例如 5%3=2。
x^y
x**y x 的 y 次方。例如2^3=8。



6.2 比較算式與布林算式

比較算式 (comparison expression) 用來(lái)比較字串或數(shù)字的關(guān)系
,運(yùn)算符號(hào)與 C 語(yǔ)言相同。表列如下:

x x<=y
x>y
x>=y
x==y
x!=y
x~y
x!~y

比較的結(jié)果為真(true)則其值是 1。否則其值是 0。
布林算式(boolean expression)有下面三種:

boolean1 && boolean2
boolean1 || boolean2
! boolean



6.3 條件算式(Conditional Expressions)

一個(gè)條件式算式是一種特別的算式,它含有3個(gè)運(yùn)算元。
條件式算式與C語(yǔ)言的相同:

selector ? if-true-exp : if-false-exp

它有3個(gè)子算式。第一個(gè)子算式selector 首先會(huì)被計(jì)算。如果是真,
則if-true-exp會(huì)被計(jì)算且它的值變成整個(gè)算式的值。否則if-false-
exp 會(huì)被計(jì)算且它的值變成整個(gè)算式的值。

例如下面的例子會(huì)產(chǎn)生x的絕對(duì)值:
x>0 ? x : -x

第七章 Actions里面的控制敘述

在 gawk 程式里面,控制敘述諸如 if、while 等控制程式執(zhí)行的流
程。在 gawk 里的控制敘述與 C 的類似。

很多的控制敘述會(huì)包括其它的敘述,被包括的敘述稱為 body。假
如 body 里面包括一個(gè)以上的敘述,必須以大括弧 { } 將這些敘述括起
來(lái),而各個(gè)敘述之間需以換行(newline)或分號(hào)隔開。



7.1 if 敘述

if (condition) then-body [else else-body]
(p30 of
如果 condition 為真(true),則執(zhí)行 then-body,否則執(zhí)行 else-body。

舉一個(gè)例子如下:

if (x % 2 == 0)
print "x is even"
else
print "x is odd"



7.2 while 敘述

while (condition)
body

while 敘述做的第一件事就是測(cè)試 condition。假如 condition 為真則
執(zhí)行 body 的敘述。body 的敘述執(zhí)行完後,會(huì)再測(cè)試 condition,假如
condition 為真,則 body 會(huì)再度被執(zhí)行。這個(gè)過(guò)程會(huì)一直被重復(fù)直到
condition 不再是真。如果 condition 第一次測(cè)試就是偽(false),則
body 從沒(méi)有被執(zhí)行。

下面的例子會(huì)印出每個(gè)輸入記錄(record)的前三個(gè)欄位。

gawk '{ i=1
while (i <= 3) {
print $i
i++
}
}'



7.3 do-while 敘述

do
body
while (condition)

這個(gè) do loop 執(zhí)行 body 一次,然後只要 condition 是真則會(huì)重復(fù)執(zhí)行 body。
(p32 of
即使開始時(shí) condition 是偽,body 也會(huì)被執(zhí)行一次。

下面的例子會(huì)印出每個(gè)輸入記錄十次。

gawk '{ i= 1
do {
print $0
i++
} while (i <= 10)
}'



7.4 for 敘述

for (initialization; condition; increment)
body

此敘述開始時(shí)會(huì)執(zhí)行initialization,然後只要 condition是真,它
會(huì)重復(fù)執(zhí)行body與做increment 。

下面的例子會(huì)印出每個(gè)輸入記錄的前三個(gè)欄位。

gawk '{ for (i=1; i<=3; i++)
print $i
}'



7.5 break 敘述

break 敘述會(huì)跳出包含它的 for、while、do-while 回圈的最內(nèi)層。

下面的例子會(huì)找出任何整數(shù)的最小除數(shù),它也會(huì)判斷是否為質(zhì)數(shù)。

gawk '# find smallest divisor of num
{ num=$1
for (div=2; div*div <=num; div++)
if (num % div == 0)
break
if (num % div == 0)
printf "Smallest divisor of %d is %d ", num, div
else
printf "%d is prime ", num }'



7.6 continue 敘述
(p34 of 46)
continue 敘述使用於 for、while、do-while 回圈內(nèi)部,它會(huì)跳
過(guò)回圈 body 的剩馀部分,使得它立刻進(jìn)行下一次回圈的執(zhí)行。

下面的例子會(huì)印出 0 至 20 的全部數(shù)字,但是 5 并不會(huì)被印出。

gawk 'BEGIN {
for (x=0; x<=20; x++) {
if (x==5)
continue
printf ("%d",x)
}
print ""
}'



7.7 next 敘述、next file 敘述、exit 敘述

next 敘述強(qiáng)迫 gawk 立刻停止處理目前的記錄(record)而繼續(xù)下一
個(gè)記錄。

next file 敘述類似 next。然而,它強(qiáng)迫 gawk 立刻停止處理目前
的資料檔。

exit 敘述會(huì)使得 gawk 程式停止執(zhí)行而跳出。然而,如果 END 出現(xiàn)
,它會(huì)去執(zhí)行 END 的 actions。

第八章 內(nèi)建函式(Built-in Functions)

內(nèi)建函式是 gawk 內(nèi)建的函式,可在 gawk 程式的任何地方呼叫內(nèi)建
函式。



8.1 數(shù)值方面的內(nèi)建函式

int(x) 求出 x 的整數(shù)部份,朝向 0 的方向做舍去。例如:int(3.9)
是 3,int(-3.9) 是 -3。
(p36 of 46)
sqrt(x) 求出 x 正的平方根值。例 sqrt(4)=2
exp(x) 求出 x 的次方。例 exp(2) 即是求 e*e 。
log(x) 求出 x 的自然對(duì)數(shù)。
sin(x) 求出 x 的 sine 值,x 是弳度量。
cos(x) 求出 x 的 cosine 值,x 是弳度量。
atan2(y,x) 求 y/x 的 arctangent 值,所求出的值其單位是弳度量。
rand() 得出一個(gè)亂數(shù)值。此亂數(shù)值平均分布在 0 和 1 之間。這個(gè)
值不會(huì)是 0,也不會(huì)是 1。
每次執(zhí)行 gawk,rand 開始產(chǎn)生數(shù)字從相同點(diǎn)或 seed。
srand(x) 設(shè)定產(chǎn)生亂數(shù)的開始點(diǎn)或 seed 為 x。如果在第二次你設(shè)
定相同的 seed 值,你將再度得到相同序列的亂數(shù)值。
如果省略引數(shù) x,例如 srand(),則現(xiàn)在的日期、時(shí)間會(huì)
被當(dāng)成 seed。這個(gè)方法可使得亂數(shù)值是真正不可預(yù)測(cè)的。
srand 的傳回值(return value)是前次所設(shè)定的 seed 值。



8.2 字串方面的內(nèi)建函式

index(in, find)
(p37 of 46)
它會(huì)在字串 in 里面,尋找字串 find 第一次出現(xiàn)的地方,傳回值是
字串 find 出現(xiàn)在字串 in 里面的位置。如果在字串 in 里面找不到字
串 find,則傳回值為 0。
例如:
print index("peanut","an"
會(huì)印出 3。

length(string)
求出 string 有幾個(gè)字元。
例如:
length("abcde"
是 5。

match(string,regexp)
match 函式會(huì)在字串 string 里面,尋找符合 regexp 的最長(zhǎng)、最靠
左邊的子字串。傳回值是 regexp 在 string 的開始位置,即 index
值。
match 函式會(huì)設(shè)定內(nèi)在變數(shù) RSTART 等於 index,它也會(huì)設(shè)定內(nèi)在變
數(shù) RLENGTH 等於符合的字元個(gè)數(shù)。如果不符合,則會(huì)設(shè)定 RSTART 為
0、RLENGTH 為 -1。
(p38 of 46)

sprintf(format,expression1,...)
舉 printf 類似,但是 sprintf 并不印出,而是傳回字串。
例如:
sprintf("pi = %.2f (approx.)',22/7)
傳回的字串為"pi = 3.14 (approx.)"

sub(regexp, replacement,target)
在字串 target 里面,尋找符合 regexp 的最長(zhǎng)、最靠左邊的地方,
以字串 replacement 代替最左邊的 regexp。
例如:
str = "water, water, everywhere"
sub(/at/, "ith",str)
結(jié)果字串str會(huì)變成
"wither, water, everywhere"

gsub(regexp, replacement, target)
gsub 與前面的 sub 類似。在字串 target 里面,尋找符合 regexp 的
所有地方,以字串 replacement 代替所有的 regexp。
例如:
(p39 of 46)
str="water, water, everywhere"
gsub(/at/, "ith",str)
結(jié)果字串str會(huì)變成
'wither, wither, everywhere"

substr(string, start, length)
傳回字串 string 的子字串,這個(gè)子字串的長(zhǎng)度為 length 個(gè)字元,
從第 start 個(gè)位置開始。
例如:
substr("washington",5,3)
傳回值為"ing"
如果 length 沒(méi)有出現(xiàn),則傳回的子字串是從第 start 個(gè)位置開始
至結(jié)束。
例如:
substr("washington",5)
傳回值為"ington"

tolower(string)
將字串string的大寫字母改為小寫字母。
例如:
tolower("MiXeD cAsE 123"
傳回值為"mixed case 123"

toupper(string)
將字串string的小寫字母改為大寫字母。
例如:
toupper("MiXeD cAsE 123"
傳回值為"MIXED CASE 123"



8.3 輸入輸出的內(nèi)建函式

close(filename)
將輸入或輸出的檔案 filename 關(guān)閉。

system(command)
此函式允許使用者執(zhí)行作業(yè)系統(tǒng)的指令,執(zhí)行完畢後將回到 gawk
程式。
例如:
BEGIN {system("ls"}


第九章 使用者定義的函式(User-defined Functions)

復(fù)雜的 gawk 程式常?梢允褂米约憾x的函式來(lái)簡(jiǎn)化。呼叫使用
者定義的函式與呼叫內(nèi)建函式的方法一樣。



9.1 函式定義的格式

函式的定義可以放在 gawk 程式的任何地方。

一個(gè)使用者定義的函式其格式如下:

function name (parameter-list) {
body-of-function
}

name 是所定義的函式之名稱。一個(gè)正確的函式名稱可包括一序列的字
母、數(shù)字、下標(biāo)線 (underscores),但是不可用數(shù)字做開頭。

parameter-list 是列出函式的全部引數(shù)(argument),各個(gè)引數(shù)之
間以逗點(diǎn)隔開。

body-of-function 包含 gawk 的敘述 (statement)。它是函式定義
里最重要的部份,它決定函式實(shí)際要做何種事。



9.2 函式定義的例子

下面這個(gè)例子,會(huì)將每個(gè)記錄的第一個(gè)欄位之值的平方與第二個(gè)
欄位之值的平方加起來(lái)。

{print "sum =",SquareSum($1,$2)}
function SquareSum(x,y) {
sum=x*x+y*y
return sum
}


第十章 □例

這里將列出 gawk 程式的一些例子。

gawk '{if (NF > max) max = NF}
END {print max}'
此程式會(huì)印出所有輸入行之中,欄位的最大個(gè)數(shù)。

gawk 'length($0) > 80'
此程式會(huì)印出一行超過(guò) 80 個(gè)字元的每一行。此處只有 pattern 被
列出,action 是采用內(nèi)定的 print。

gawk 'NF > 0'
對(duì)於擁有至少一個(gè)欄位的所有行,此程式皆會(huì)印出。這是一個(gè)簡(jiǎn)
單的方法,將一個(gè)檔案里的所有空白行刪除。

gawk '{if (NF > 0) print}'
對(duì)於擁有至少一個(gè)欄位的所有行,此程式皆會(huì)印出。這是一個(gè)簡(jiǎn)
單的方法,將一個(gè)檔案里的所有空白行刪除。

gawk 'BEGIN {for (i = 1; i <= 7; i++)
print int(101 * rand())}'
此程式會(huì)印出□圍是 0 到 100 之間的 7 個(gè)亂數(shù)值。

ls -l files | gawk '{x += $4}; END {print "total bytes: " x}'
此程式會(huì)印出所有指定的檔案之bytes數(shù)目的總和。

expand file | gawk '{if (x < length()) x = length()}
END {print "maximum line length is " x}'
此程式會(huì)將指定檔案里最長(zhǎng)一行的長(zhǎng)度印出。expand 會(huì)將 tab 改
成 space,所以是用實(shí)際的右邊界來(lái)做長(zhǎng)度的比較。

gawk 'BEGIN {FS = ":"}
{print $1 | "sort"}' /etc/passwd
此程式會(huì)將所有使用者的login名稱,依照字母的順序印出

gawk '{nlines++}
END {print nlines}'
此程式會(huì)將一個(gè)檔案的總行數(shù)印出。

gawk 'END {print NR}'
此程式也會(huì)將一個(gè)檔案的總行數(shù)印出,但是計(jì)算行數(shù)的工作由gawk
來(lái)做。

gawk '{print NR,$0}'
此程式印出檔案的內(nèi)容時(shí),會(huì)在每行的最前面印出行號(hào),它的功
能與 'cat -n' 類似。



第十一章 結(jié)論

gawk 對(duì)於資料的處理具有很強(qiáng)的功能。它能夠以很短的程式完成
想要做的事,甚至一或二行的程式就能完成指定的工作。同樣的一件
工作,以 gawk 程式來(lái)寫會(huì)比用其它程式語(yǔ)言來(lái)寫短很多。
gawk 是 GNU 所做的 awk,它是公眾軟體(Public Domain) 可免費(fèi)使
用。(linux知識(shí)寶庫(kù))

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2004-03-25 09:21 |只看該作者

gawk的使用方法

不錯(cuò)!好貼,多來(lái)些。

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2004-03-25 09:43 |只看該作者

gawk的使用方法

so fine it is, thx!

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2004-03-25 09:51 |只看該作者

gawk的使用方法

GOOD,..................

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2004-04-27 04:43 |只看該作者

gawk的使用方法


3Q U
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP