<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-204  評(píng)論-90  文章-8  trackbacks-0
    來(lái)源: ChinaUnix博客  作者: 發(fā)布時(shí)間:2007-01-02 04:13:00
    a w k是一種程式語(yǔ)言,對(duì)文件資料的處理具有非常強(qiáng)的功能。awk 名稱是由他三個(gè)最初設(shè)計(jì)
    者的姓氏的第一個(gè)字母而命名的: Alfred V. Aho、Peter J. We i n b e rg e r、Brian W. Kernighan。
    a w k最初在1 9 7 7年完成。1 9 8 5年發(fā)表了一個(gè)新版本的a w k,他的功能比舊版本增強(qiáng)了不少。a w k 能夠用非常短的程式對(duì)文件里的資料做修改、比較、提取、打印等處理。如果使用C 或P a s c a l
    等語(yǔ)言編寫程式完成上述的任務(wù)會(huì)十分不方便而且非?;ㄙM(fèi)時(shí)間,所寫的程式也會(huì)非常大。a w k不僅僅是個(gè)編程語(yǔ)言,他還是L i n u x系統(tǒng)管理員和程式員的一個(gè)不可缺少的工具。a w k語(yǔ)言本身十分好學(xué),易于掌控,并且特別的靈活。 gawk 是G N U計(jì)劃下所做的a w k,gawk 最初在1 9 8 6年完成,之后不斷地被改進(jìn)、更新。

    gawk 包含awk 的所有功能。
    6.1 gawk的主要功能
    gawk 的主要功能是針對(duì)文件的每一行( l i n e ),也就是每一條記錄,搜尋指定的格式。當(dāng)某
    一行符合指定的格式時(shí),gawk 就會(huì)在此行執(zhí)行被指定的動(dòng)作。gawk 依此方式自動(dòng)處理輸入文
    件的每一行直到輸入文件檔案結(jié)束。
    g a w k經(jīng)常用在如下的幾個(gè)方面:
    • 根據(jù)需求選擇文件的某幾行,幾列或部分字段以供顯示輸出。
    • 分析文件中的某一個(gè)字出現(xiàn)的頻率、位置等。
    • 根據(jù)某一個(gè)文件的信息準(zhǔn)備格式化輸出。
    • 以一個(gè)功能十分強(qiáng)大的方式過濾輸出文件。
    • 根據(jù)文件中的數(shù)值進(jìn)行計(jì)算。
    6.2 怎么執(zhí)行g(shù)awk程式
    基本上有兩種方法能執(zhí)行g(shù) a w k程式。
    如果gawk 程式非常短,則能將gawk 直接寫在命令行,如下所示:
    gawk ’program’ input-file1 input-file2 ...
    其中program 包括一些pattern 和a c t i o n。
    如果gawk 程式較長(zhǎng),較為方便的做法是將gawk 程式存在一個(gè)文件中,
    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 ...
    6.3 文件、記錄和字段
    一般情況下,g a w k能處理文件中的數(shù)值數(shù)據(jù),但也能處理字符串信息。如果數(shù)據(jù)沒有
    存儲(chǔ)在文件中,能通過管道命令和其他的重定向方法給g a w k提供輸入。當(dāng)然, g a w k只能處
    理文本文件(A S C I I碼文件)。
    電話號(hào)碼本就是個(gè)g a w k能處理的文件的簡(jiǎn)單例子。電話號(hào)碼本由非常多條目組成,每一
    個(gè)條目都有同樣的格式:姓、名、地址、電話號(hào)碼。每一個(gè)條目都是按字母順序排列。
    在g a w k中,每一個(gè)這樣的條目叫做一個(gè)記錄。他是個(gè)完整的數(shù)據(jù)的集合。例如,電話號(hào)
    碼本中的Smith John這個(gè)條目,包括他的地址和電話號(hào)碼,就是一條記錄。
    記錄中的每一項(xiàng)叫做一個(gè)字段。在g a w k中,字段是最基本的單位。多個(gè)記錄的集合組成了
    一個(gè)文件。
    大多數(shù)情況下,字段之間由一個(gè)特別的字符分開,像空格、TA B、分號(hào)等。這些字符叫做
    字段分隔符。請(qǐng)看下面這個(gè)/ e t c / p a s s w d文件:
    t p a r k e r ; t 3 6 s 6 2 h s h ; 5 0 1 ; 1 0 1 ; Tim Parker;/home/tparker;/bin/bash
    etreijs;2ys639dj3h;502;101;Ed Tr e i j s ; / h o m e / e t r e i j s ; / b i n / t c s h
    y c h o w ; 1 h 2 7 s j ; 5 0 3 ; 1 0 1 ; Yvonne Chow;/home/ychow;/bin/bash
    你能看出/ e t c / p a s s w d文件使用分號(hào)作為字段分隔符。/ e t c / p a s s w d文件中的每一行都包括
    七個(gè)字段:用戶名;口令;用戶I D;工作組I D;注釋; h o m e目錄;啟始的外殼。如果你想要
    查找第六個(gè)字段,只需數(shù)過五個(gè)分號(hào)即可。
    但考慮到以下電話號(hào)碼本的例子,你就會(huì)發(fā)現(xiàn)一些問題:
    Smith John 13 Wilson St. 555-1283
    Smith John 2736 Artside Dr Apt 123 555-2736
    Smith John 125 Westmount Cr 555-1726
    雖然我們能夠分辨出每個(gè)記錄包括四個(gè)字段,但g a w k卻無(wú)能為力。電話號(hào)碼本使用空格作
    為分隔符,所以g a w k認(rèn)為S m i t h是第一個(gè)字段, John 是第二個(gè)字段,1 3是第三個(gè)字段,依次類
    推。就g a w k而言,如果用空格作為字段分隔符的話,則第一個(gè)記錄有六個(gè)字段,而第二個(gè)記
    錄有八個(gè)字段。
    所以,我們必須找出一個(gè)更好的字段分隔符。例如,像下面相同使用斜杠作為字段分隔
    符:
    Smith/John/13 Wilson St./555-1283
    Smith/John/2736 Artside Dr/Apt/123/555-2736
    Smith/John/125 Westmount Cr/555-1726
    如果你沒有指定其他的字符作為字段分隔符,那么g a w k將缺省地使用空格或TA B作為字段
    分隔符。
    6.4 模式和動(dòng)作
    在g a w k語(yǔ)言中每一個(gè)命令都由兩部分組成:一個(gè)模式( p a t t e r n)和一個(gè)相應(yīng)的動(dòng)作
    (a c t i o n)。只要模式符合,g a w k就會(huì)執(zhí)行相應(yīng)的動(dòng)作。其中模式部分用兩個(gè)斜杠括起來(lái),而動(dòng)
    作部分用一對(duì)花括號(hào)括起來(lái)。例如:
    / p a t t e r n 1 / { a c t i o n 1 }
    / p a t t e r n 2 / { a c t i o n 2 }
    / p a t t e r n 3 / { a c t i o n 3 }
    所有的g a w k程式都是由這樣的一對(duì)對(duì)的模式和動(dòng)作組成的。其中模式或動(dòng)作都能夠被省
    略,不過兩個(gè)不能同時(shí)被省略。如果模式被省略,則對(duì)于作為輸入的文件里面的每一行,動(dòng)作
    都會(huì)被執(zhí)行。如果動(dòng)作被省略,則缺省的動(dòng)作被執(zhí)行,既顯示出所有符合模式的輸入行而不做
    所有的改動(dòng)。
    下面是個(gè)簡(jiǎn)單的例子,因?yàn)間awk 程式非常短,所以將gawk 程式直接寫在外殼命令行:
    gawk ’/tparker/’ /etc/passwd
    此程式在上面提到的/ e t c / p a s s w d文件中尋找符合t p a r k e r模式的記錄并顯示(此例中沒有動(dòng)
    作,所以缺省的動(dòng)作被執(zhí)行)。
    讓我們?cè)倏匆粋€(gè)例子:
    gawk ’/UNIX/{print $2}’ file2.data
    此命令將逐行查找f i l e 2 . d a t a文件中包含U N I X的記錄,并打印這些記錄的第二個(gè)字段。
    你也能在一個(gè)命令中使用多個(gè)模式和動(dòng)作對(duì),例如:
    gawk ’/scandal/{print $1} /rumor/{print $2}’ gossip_file
    此命令搜索文件g o s s i p _ f i l e中包括s c a n d a l的記錄,并打印第一個(gè)字段。然后再?gòu)念^搜索
    g o s s i p _ f i l e中包括r u m o r的記錄,并打印第二個(gè)字段。
    6.5 比較運(yùn)算和數(shù)值運(yùn)算
    g a w k有非常多比較運(yùn)算符,下面列出重要的幾個(gè):
    = = 相等
    ! = 不相等
    > 大于
    = 大于等于
    100’ testfile
    將會(huì)顯示文件testfile 中那些第四個(gè)字段大于1 0 0的記錄。
    下表列出了g a w k中基本的數(shù)值運(yùn)算符。
    運(yùn)算符說(shuō)明示例
    + 加法運(yùn)算2+6
    - 減法運(yùn)算6-3
    * 乘法運(yùn)算2*5
    / 除法運(yùn)算8/4
    ^ 乘方運(yùn)算3^2 (=9)
    % 求余數(shù)9%4 (=1)
    例如:
    {print $3/2}
    顯示第三個(gè)字段被2除的結(jié)果。
    在g a w k中,運(yùn)算符的優(yōu)先權(quán)和一般的數(shù)學(xué)運(yùn)算的優(yōu)先權(quán)相同。例如:
    {print $1+$2*$3}
    顯示第二個(gè)字段和第三個(gè)字段相乘,然后和第一個(gè)字段相加的結(jié)果。
    你也能用括號(hào)改動(dòng)優(yōu)先次序。例如:
    {print ($1+$2)*$3}
    顯示第一個(gè)字段和第二個(gè)字段相加,然后和第三個(gè)字段相乘的結(jié)果。
    6.6 內(nèi)部函數(shù)
    g a w k中有各種的內(nèi)部函數(shù),目前介紹如下:
    6.6.1 隨機(jī)數(shù)和數(shù)學(xué)函數(shù)
    sqrt(x) 求x 的平方根
    sin(x) 求x 的正弦函數(shù)
    cos(x) 求x 的余弦函數(shù)
    a t a n 2 ( x,y) 求x / y的余切函數(shù)
    log(x) 求x 的自然對(duì)數(shù)
    exp(x) 求x 的e 次方
    int(x) 求x 的整數(shù)部分
    rand() 求0 和1之間的隨機(jī)數(shù)
    srand(x) 將x 設(shè)置為r a n d ( )的種子數(shù)
    6.6.2 字符串的內(nèi)部函數(shù)
    • i n d e x ( i n,find) 在字符串in 中尋找字符串find 第一次出現(xiàn)的地方,返回值是字符串
    find 出目前字符串in 里面的位置。如果在字符串in 里面未找到字符串f i n d,則返回值為
    0。
    例如:
    print index("peanut"," a n " )
    顯示結(jié)果3。
    • length(string) 求出string 有幾個(gè)字符。
    例如:
    l e n g t h ( " a b c d e " )
    顯示結(jié)果5。
    • m a t c h ( s t r i n g,r e g e x p ) 在字符串string 中尋找符合regexp 的最長(zhǎng)、最靠左邊的子字
    符串。返回值是regexp 在string 的開始位置,即i n d e x值。match 函數(shù)將會(huì)設(shè)置系統(tǒng)變量
    R S TA RT 等于i n d e x的值,系統(tǒng)變量RLENGTH 等于符合的字符個(gè)數(shù)。如果不符合,則會(huì)
    設(shè)置R S TA RT 為0、RLENGTH 為- 1。
    • s p r i n t f ( f o r m a t,e x p r e s s i o n 1,. . . ) 和printf 類似,不過sprintf 并不顯示,而是返回字符
    串。
    例如:
    sprintf("pi = %.2f (approx.)",2 2 / 7 )
    返回的字符串為pi = 3.14 (approx.)
    • s u b ( r e g e x p,r e p l a c e m e n t,t a rg e t ) 在字符串t a rget 中尋找符合regexp 的最長(zhǎng)、最靠左的
    地方,以字串replacement 代替最左邊的r e g e x p。
    例如:
    str = "water,w a t e r,e v e r y w h e r e "
    s u b ( / a t /, " i t h ",s t r )
    結(jié)果字符串s t r會(huì)變成
    w i t h e r,w a t e r,e v e r y w h e r e
    • g s u b ( r e g e x p,r e p l a c e m e n t,t a rget) 和前面的s u b類似。在字符串t a rget 中尋找符合
    r e g e x p的所有地方,以字符串replacement 代替所有的r e g e x p。
    例如:
    s t r = " w a t e r,w a t e r,e v e r y w h e r e "g s u b ( / a t /, " i t h ",s t r )
    結(jié)果字符串s t r會(huì)變成
    w i t h e r,w i t h e r,e v e r y w h e r e
    • s u b s t r ( s t r i n g,s t a r t,length) 返回字符串string 的子字符串,這個(gè)子字符串的長(zhǎng)度為
    l e n g t h,從第start 個(gè)位置開始。
    例如:
    s u b s t r ( " w a s h i n g t o n ",5,3 )
    返回值為i n g
    如果沒有l(wèi)ength ,則返回的子字符串是從第start 個(gè)位置開始至結(jié)束。
    例如:
    s u b s t r ( " w a s h i n g t o n ",5 )
    返回值為i n g t o n。
    • tolower(string) 將字符串s t r i n g的大寫字母改為小寫字母。
    例如:
    tolower("MiXeD cAsE 123")
    返回值為mixed case 123。
    • toupper(string) 將字符串s t r i n g的小寫字母改為大寫字母。
    例如:
    toupper("MiXeD cAsE 123")
    返回值為MIXED CASE 123。
    6.6.3 輸入輸出的內(nèi)部函數(shù)
    • close(filename) 將輸入或輸出的文件filename 關(guān)閉。
    • system(command) 此函數(shù)允許用戶執(zhí)行操作系統(tǒng)的指令,執(zhí)行完畢后將回到g a w k程
    序。
    例如:
    BEGIN {system("ls")}
    6.7 字符串和數(shù)字
    字符串就是一連串的字符,他能被g a w k逐字地翻譯。字符串用雙引號(hào)括起來(lái)。數(shù)字不能
    用雙引號(hào)括起來(lái),并且g a w k將他當(dāng)作一個(gè)數(shù)值。例如:
    gawk ’$1 != "Tim" {print}’ testfile
    此命令將顯示第一個(gè)字段和Ti m不相同的所有記錄。如果命令中Ti m兩邊不用雙引號(hào),
    g a w k將不能正確執(zhí)行。
    再如:
    gawk ’$1 == "50" {print}’ testfile
    此命令將顯示所有第一個(gè)字段和5 0這個(gè)字符串相同的記錄。g a w k不管第一字段中的數(shù)值
    的大小,而只是逐字地比較。這時(shí),字符串5 0和數(shù)值5 0并不相等。
    6.8 格式化輸出
    我們能讓動(dòng)作顯示一些比較復(fù)雜的結(jié)果。例如:
    gawk ’$1 != "Tim" {print $1,$ 5,$ 6,$2}’ testfile
    將顯示t e s t f i l e文件中所有第一個(gè)字段和Ti m不相同的記錄的第一、第五、第六和第二個(gè)字
    段。
    進(jìn)一步,你能在p r i n t動(dòng)作中加入字符串,例如:
    gawk ’$1 != "Tim" {print "The entry for ",$ 1,"is not Tim. ",$2}’ testfile
    p r i n t動(dòng)作的每一部分用逗號(hào)隔開。
    借用C語(yǔ)言的格式化輸出指令,能讓g a w k的輸出形式更為多樣。這時(shí),應(yīng)該用p r i n t f而不
    是p r i n t。例如:
    {printf "%5s likes this language\n",$ 2 }
    p r i n t f中的%5s 部分告訴gawk 怎么格式化輸出字符串,也就是輸出5個(gè)字符長(zhǎng)。他的值由
    printf 的最后部分指出,在此是第二個(gè)字段。\ n是回車換行符。如果第二個(gè)字段中存儲(chǔ)的是人
    名,則輸出結(jié)果大致如下:
    Tim likes this language
    G e o ff likes this language
    Mike likes this language
    Joe likes this language
    gawk 語(yǔ)言支持的其他格式控制符號(hào)如下:
    • c 如果是字符串,則顯示第一個(gè)字符;如果是整數(shù),則將數(shù)字以ASCII 字符的形式顯示。
    例如:
    printf “% c”,6 5
    結(jié)果將顯示字母A。
    • d 顯示十進(jìn)制的整數(shù)。
    • i 顯示十進(jìn)制的整數(shù)。
    • e 將浮點(diǎn)數(shù)以科學(xué)記數(shù)法的形式顯示。
    例如:
    print “$ 4 . 3 e”,1 9 5 0
    結(jié)果將顯示1 . 9 5 0 e + 0 3。
    • f 將數(shù)字以浮點(diǎn)的形式顯示。
    • g 將數(shù)字以科學(xué)記數(shù)法的形式或浮點(diǎn)的形式顯示。數(shù)字的絕對(duì)值如果大于等于0 . 0 0 0 1則
    以浮點(diǎn)的形式顯示,否則以科學(xué)記數(shù)法的形式顯示。
    • o 顯示無(wú)符號(hào)的八進(jìn)制整數(shù)。
    • s 顯示一個(gè)字符串。
    • x 顯示無(wú)符號(hào)的十六進(jìn)制整數(shù)。1 0至1 5以a至f表示。
    • X 顯示無(wú)符號(hào)的十六進(jìn)制整數(shù)。1 0至1 5以A至F表示。
    • % 他并不是真正的格式控制字符,% %將顯示%。
    當(dāng)你使用這些格式控制字符時(shí),你能在控制字符前給出數(shù)字,以表示你將用的幾位或幾
    個(gè)字符。例如,6 d表示一個(gè)整數(shù)有6位。再請(qǐng)看下面的例子:
    {printf "%5s works for %5s and earns %2d an hour",$ 1,$ 2,$ 3 }
    將會(huì)產(chǎn)生類似如下的輸出:
    Joe works for Mike and earns 12 an hour
    當(dāng)處理數(shù)據(jù)時(shí),你能指定數(shù)據(jù)的精確位數(shù)
    {printf "%5s earns $%.2f an hour",$ 3,$ 6 }
    其輸出將類似于:
    Joe earns $12.17 an hour
    你也能使用一些換碼控制符格式化整行的輸出。之所以叫做換碼控制符,是因?yàn)間 a w k對(duì)
    這些符號(hào)有特別的解釋。下面列出常用的換碼控制符:
    \a 警告或響鈴字符。
    \b 后退一格。
    \f 換頁(yè)。
    \n 換行。
    \r 回車。
    \t Ta b。
    \v 垂直的t a b。
    6.9 改動(dòng)字段分隔符
    在g a w k中,缺省的字段分隔符一般是空格符或TA B。但你能在命令行使用- F選項(xiàng)改動(dòng)字
    符分隔符,只需在- F后面跟著你想用的分隔符即可。
    gawk -F" ;"’/tparker/{print}’ /etc/passwd
    在此例中,你將字符分隔符設(shè)置成分號(hào)。注意: - F必須是大寫的,而且必須在第一個(gè)引號(hào)
    之前。
    6.10 元字符
    g a w k語(yǔ)言在格式匹配時(shí)有其特別的規(guī)則。例如, c a t能夠和記錄中所有位置有這三個(gè)字符
    的字段匹配。但有時(shí)你需要一些更為特別的匹配。如果你想讓c a t只和c o n c a t e n a t e匹配,則需要
    在格式兩端加上空格:
    / cat / {print}
    再例如,你希望既和c a t又和C AT匹配,則能使用或(|):
    / cat | CAT / {print}
    在g a w k中,有幾個(gè)字符有特別意義。下面列出能用在g a w k格式中的這些字符:
    • ^ 表示字段的開始。
    例如:
    $3 ~ /^b/
    如果第三個(gè)字段以字符b開始,則匹配。
    • $ 表示字段的結(jié)束。
    例如:
    $3 ~ /b$/
    如果第三個(gè)字段以字符b結(jié)束,則匹配。
    • . 表示和所有單字符m匹配。
    例如:
    $3 ~ /i.m/
    如果第三個(gè)字段有字符i,則匹配。
    • | 表示“或”。
    例如:
    / c a t | C AT/
    和cat 或C AT字符匹配。
    • * 表示字符的零到多次重復(fù)。
    例如:
    /UNI*X/
    和U N X、U N I X、U N I I X、U N I I I X等匹配。
    • + 表示字符的一次到多次重復(fù)。
    例如:
    /UNI+X/
    和U N I X、U N I I X等匹配。
    • \{a,b\} 表示字符a次到b次之間的重復(fù)。
    例如:
    / U N I \ { 1,3 \ } X
    和U N I X、U N I I X和U N I I I X匹配。
    • ? 表示字符零次和一次的重復(fù)。
    例如:
    /UNI?X/
    和UNX 和U N I X匹配。
    • [] 表示字符的范圍。
    例如:
    /I[BDG]M/
    和I B M、I D M和I G M匹配
    • [^] 表示不在[ ]中的字符。
    例如:
    /I[^DE]M/
    和所有的以I開始、M結(jié)束的包括三個(gè)字符的字符串匹配,除了I D M和I E M之外。
    6.11 調(diào)用gawk程式
    當(dāng)需要非常多對(duì)模式和動(dòng)作時(shí),你能編寫一個(gè)g a w k程式(也叫做g a w k腳本)。在g a w k程式
    中,你能省略模式和動(dòng)作兩邊的引號(hào),因?yàn)樵趃 a w k程式中,模式和動(dòng)作從哪開始和從哪結(jié)
    束時(shí)是非常顯然的。
    你能使用如下命令調(diào)用g a w k程式:
    gawk -f script filename
    此命令使g a w k對(duì)文件f i l e n a m e執(zhí)行名為s c r i p t的g a w k程式。
    如果你不希望使用缺省的字段分隔符,你能在f選項(xiàng)后面跟著F選項(xiàng)指定新的字段分隔符
    (當(dāng)然你也能在g a w k程式中指定),例如,使用分號(hào)作為字段分隔符:
    gawk -f script -F";" filename
    如果希望gawk 程式處理多個(gè)文件,則把各個(gè)文件名羅列其后:
    gawk -f script filename1 filename2 filename3 ...
    缺省情況下, g a w k的輸出將送往屏幕。但你能使用L i n u x的重定向命令使g a w k的輸出送
    往一個(gè)文件:
    gawk -f script filename > save_file
    6.12 BEGIN和END
    有兩個(gè)特別的模式在g a w k中非常有用。B E G I N模式用來(lái)指明g a w k開始處理一個(gè)文件之前執(zhí)行一些動(dòng)作。B E G I N經(jīng)常用來(lái)初始化數(shù)值,設(shè)置參數(shù)等。E N D模式用來(lái)在文件處理完成后
    執(zhí)行一些指令,一般用作總結(jié)或注釋。
    BEGIN 和E N D中所有要執(zhí)行的指令都應(yīng)該用花括號(hào)括起來(lái)。BEGIN 和E N D必須使用大寫。
    請(qǐng)看下面的例子:
    BEGIN { print "Starting the process the file" }
    $1 == "UNIX" {print}
    $2 > 10 {printf "This line has a value of %d",$ 2 }
    END { print "Finished processing the file. Bye!"}
    此程式中,先顯示一條信息: Starting the process the file,然后將所有第一個(gè)字段等于
    U N I X的整條記錄顯示出來(lái),然后再顯示第二個(gè)字段大于10 的記錄,最后顯示信息: F i n i s h e d
    processing the file. Bye!。
    6.13 變量
    在g a w k中,能用等號(hào)( = )給一個(gè)變量賦值:
    var1 = 10
    在g a w k中,你不必事先聲明變量類型。
    請(qǐng)看下面的例子:
    $1 == "Plastic" { count = count + 1 }
    如果第一個(gè)字段是P l a s t i c,則c o u n t的值加1。在此之前,我們應(yīng)當(dāng)給c o u n t賦予過初值,一
    般是在B E G I N部分。
    下面是比較完整的例子:
    BEGIN { count = 0 }
    $5 == "UNIX" { count = count + 1 }
    END { printf "%d occurrences of UNIX were found",count }
    變量能和字段和數(shù)值一起使用,所以,下面的表達(dá)式均為合法:
    count = count + $6
    count = $5 - 8
    count = $5 + var1
    變量也能是格式的一部分,例如:
    $2 > max_value {print "Max value exceeded by ",$2 - max_value}
    $4 - var1  $2){
    print "The first column is larger"
    }
    else {
    print "The second column is larger"
    } )
    6.15.2 while 循環(huán)
    while 循環(huán)的語(yǔ)法如下:
    while (expression){
    c o m m a n d s
    }
    例如:
    # interest calculation computes compound interest
    # inputs from a file are the amount,interest_rateand years
    {var = 1
    while (var  0){
    print line[var]
    v a r - -
    }
    }
    此段程式讀取一個(gè)文件的每一行,并用相反的順序顯示出來(lái)。我們使用N R作為數(shù)組的下
    標(biāo)來(lái)存儲(chǔ)文件的每一條記錄,然后在從最后一條記錄開始,將文件逐條地顯示出來(lái)。
    6.17 用戶自定義函數(shù)
    復(fù)雜的gawk 程式常常能使用自己定義的函數(shù)來(lái)簡(jiǎn)化。調(diào)用用戶自定義函數(shù)和調(diào)用內(nèi)部
    函數(shù)的方法相同。函數(shù)的定義能放在gawk 程式的所有地方。
    用戶自定義函數(shù)的格式如下:
    function name (parameter-list) {
    b o d y - o f - f u n c t i o n
    }
    name 是所定義的函數(shù)的名稱。一個(gè)正確的函數(shù)名稱可包括一序列的字母、數(shù)字、下標(biāo)線
    ( u n d e r s c o r e s ),不過不可用數(shù)字做開頭。p a r a m e t e r-list 是函數(shù)的全部參數(shù)的列表,各個(gè)參數(shù)之
    間以逗點(diǎn)隔開。body-of-function 包含gawk 的表達(dá)式,他是函數(shù)定義里最重要的部分,他決定
    函數(shù)實(shí)際要做的事情。
    下面這個(gè)例子,會(huì)將每個(gè)記錄的第一個(gè)字段的值的平方和第二個(gè)字段的值的平方加起來(lái)。
    {print "sum =",S q u a r e S u m ( $ 1,$ 2 ) }
    function SquareSum(x,y) {
    s u m = x * x + y * y
    return sum
    }
    到此,我們已知道了g a w k的基本用法。g a w k語(yǔ)言十分易學(xué)好用,例如,你能用g a w k
    編寫一段小程式來(lái)計(jì)算一個(gè)目錄中所有文件的個(gè)數(shù)和容量。如果用其他的語(yǔ)言,如C語(yǔ)言,則
    會(huì)十分的麻煩,相反,g a w k只需要幾行就能完成此工作。
    6.18 幾個(gè)實(shí)例
    最后,再舉幾個(gè)g a w k的例子:
    gawk ’{if (NF > max) max = NF}
    END {print max}’
    此程式會(huì)顯示所有輸入行之中字段的最大個(gè)數(shù)。
    gawk ’length($0) > 80’
    此程式會(huì)顯示出超過80 個(gè)字符的每一行。此處只有模式被列出,動(dòng)作是采用缺省值顯示
    整個(gè)記錄。
    gawk ’NF > 0’
    顯示擁有至少一個(gè)字段的所有行。這是個(gè)簡(jiǎn)單的方法,將一個(gè)文件里的所有空白行刪除。
    gawk ’BEGIN {for (i = 1; i  max) max = NF}
    END {print max}’
    此程式會(huì)顯示所有輸入行之中字段的最大個(gè)數(shù)。
    gawk ’length($0) > 80’
    此程式會(huì)顯示出超過80 個(gè)字符的每一行。此處只有模式被列出,動(dòng)作是采用缺省值顯示
    整個(gè)記錄。
    gawk ’NF > 0’
    顯示擁有至少一個(gè)字段的所有行。這是個(gè)簡(jiǎn)單的方法,將一個(gè)文件里的所有空白行刪除。
    gawk ’BEGIN {for (i = 1; i
    posted on 2008-10-30 12:20 一凡 閱讀(442) 評(píng)論(0)  編輯  收藏 所屬分類: linux
    主站蜘蛛池模板: 亚洲日韩精品一区二区三区| 久久免费观看国产精品| 亚洲国产午夜精品理论片在线播放| 亚洲AV无码国产丝袜在线观看| 亚洲免费日韩无码系列| 亚洲 无码 在线 专区| 国产jizzjizz视频全部免费| 国产美女精品视频免费观看 | 亚洲成在人线电影天堂色| 亚洲AV无码一区二区三区DV| 亚洲国产无套无码av电影| 亚洲va中文字幕无码久久| 亚洲精品无码国产| 亚洲av永久无码精品表情包| 亚洲av无码专区在线播放| 亚洲va在线va天堂va不卡下载| 婷婷精品国产亚洲AV麻豆不片| 亚洲成Av人片乱码色午夜| 亚洲一区精品中文字幕| 亚洲毛片在线免费观看| 亚洲国产91在线| 亚洲AV成人一区二区三区观看| 国产亚洲一卡2卡3卡4卡新区 | 久久夜色精品国产噜噜噜亚洲AV| 久久精品亚洲日本佐佐木明希| 久久久久久亚洲av成人无码国产| 老色鬼久久亚洲AV综合| 久久亚洲精品专区蓝色区| 亚洲AV无码一区二区乱子仑 | 久久亚洲精品无码aⅴ大香| 亚洲午夜国产精品| 亚洲av无码兔费综合| 永久免费精品影视网站| 国产午夜精品久久久久免费视 | 日韩大片免费观看视频播放| 在线免费视频你懂的| 久久久久高潮毛片免费全部播放| 114一级毛片免费| 国产精品免费视频一区| 亚洲中文字幕无码一区| 亚洲日韩乱码中文无码蜜桃 |