欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

awk簡介與學(xué)習(xí)筆記收集第2/3頁

 更新時間:2008年04月24日 19:58:23   作者:  
Awk學(xué)習(xí)筆記 整理:Jims of 肥肥世家 <jims.yang@gmail.com>

5. awk運算符
Table 2. 運算符

運算符 描述 
= += -= *= /= %= ^= **= 賦值 
?: C條件表達式 
|| 邏輯或 
&& 邏輯與 
~ ~! 匹配正則表達式和不匹配正則表達式 
< <= > >= != == 關(guān)系運算符 
空格 連接 
+ - 加,減 
* / & 乘,除與求余 
+ - ! 一元加,減和邏輯非 
^ *** 求冪 
++ -- 增加或減少,作為前綴或后綴 
$ 字段引用 
in 數(shù)組成員 

6. 記錄和域
6.1. 記錄
awk把每一個以換行符結(jié)束的行稱為一個記錄。

記錄分隔符:默認(rèn)的輸入和輸出的分隔符都是回車,保存在內(nèi)建變量ORS和RS中。

$0變量:它指的是整條記錄。如$ awk '{print $0}' test將輸出test文件中的所有記錄。

變量NR:一個計數(shù)器,每處理完一條記錄,NR的值就增加1。如$ awk '{print NR,$0}' test將輸出test文件中所有記錄,并在記錄前顯示記錄號。

6.2. 域
記錄中每個單詞稱做“域”,默認(rèn)情況下以空格或tab分隔。awk可跟蹤域的個數(shù),并在內(nèi)建變量NF中保存該值。如$ awk '{print $1,$3}' test將打印test文件中第一和第三個以空格分開的列(域)。

6.3. 域分隔符
內(nèi)建變量FS保存輸入域分隔符的值,默認(rèn)是空格或tab。我們可以通過-F命令行選項修改FS的值。如$ awk -F: '{print $1,$5}' test將打印以冒號為分隔符的第一,第五列的內(nèi)容。

可以同時使用多個域分隔符,這時應(yīng)該把分隔符寫成放到方括號中,如$awk -F'[:\t]' '{print $1,$3}' test,表示以空格、冒號和tab作為分隔符。

輸出域的分隔符默認(rèn)是一個空格,保存在OFS中。如$ awk -F: '{print $1,$5}' test,$1和$5間的逗號就是OFS的值。

7. gawk專用正則表達式元字符
一般通用的元字符集就不講了,可參考我的Sed和Grep學(xué)習(xí)筆記。以下幾個是gawk專用的,不適合unix版本的awk。

\Y
匹配一個單詞開頭或者末尾的空字符串。

\B
匹配單詞內(nèi)的空字符串。

\<
匹配一個單詞的開頭的空字符串,錨定開始。

\>
匹配一個單詞的末尾的空字符串,錨定末尾。

\w
匹配一個字母數(shù)字組成的單詞。

\W
匹配一個非字母數(shù)字組成的單詞。

\‘
匹配字符串開頭的一個空字符串。

\'
匹配字符串末尾的一個空字符串。

8. POSIX字符集
可參考我的Grep學(xué)習(xí)筆記

9. 匹配操作符(~)
用來在記錄或者域內(nèi)匹配正則表達式。如$ awk '$1 ~/^root/' test將顯示test文件第一列中以root開頭的行。

10. 比較表達式
conditional expression1 ? expression2: expression3,例如:$ awk '{max = {$1 > $3} ? $1: $3: print max}' test。如果第一個域大于第三個域,$1就賦值給max,否則$3就賦值給max。

$ awk '$1 + $2 < 100' test。如果第一和第二個域相加大于100,則打印這些行。

$ awk '$1 > 5 && $2 < 10' test,如果第一個域大于5,并且第二個域小于10,則打印這些行。

11. 范圍模板
范圍模板匹配從第一個模板的第一次出現(xiàn)到第二個模板的第一次出現(xiàn)之間所有行。如果有一個模板沒出現(xiàn),則匹配到開頭或末尾。如$ awk '/root/,/mysql/' test將顯示root第一次出現(xiàn)到mysql第一次出現(xiàn)之間的所有行。

12. 一個驗證passwd文件有效性的例子

$ cat /etc/passwd | awk -F: '\
NF != 7{\
printf("line %d,does not have 7 fields:%s\n",NR,$0)}\
$1 !~ /[A-Za-z0-9]/{printf("line %d,non alpha and numeric user id:%d: %s\n,NR,$0)}\
$2 == "*" {printf("line %d, no password: %s\n",NR,$0)}'


  cat把結(jié)果輸出給awk,awk把域之間的分隔符設(shè)為冒號。

  如果域的數(shù)量(NF)不等于7,就執(zhí)行下面的程序。

  printf打印字符串"line ?? does not have 7 fields",并顯示該條記錄。

  如果第一個域沒有包含任何字母和數(shù)字,printf打印“no alpha and numeric user id" ,并顯示記錄數(shù)和記錄。

  如果第二個域是一個星號,就打印字符串“no passwd”,緊跟著顯示記錄數(shù)和記錄本身。


13. 幾個實例
$ awk '/^(no|so)/' test-----打印所有以模式no或so開頭的行。

$ awk '/^[ns]/{print $1}' test-----如果記錄以n或s開頭,就打印這個記錄。

$ awk '$1 ~/[0-9][0-9]$/(print $1}' test-----如果第一個域以兩個數(shù)字結(jié)束就打印這個記錄。

$ awk '$1 == 100 || $2 < 50' test-----如果第一個或等于100或者第二個域小于50,則打印該行。

$ awk '$1 != 10' test-----如果第一個域不等于10就打印該行。

$ awk '/test/{print $1 + 10}' test-----如果記錄包含正則表達式test,則第一個域加10并打印出來。

$ awk '{print ($1 > 5 ? "ok "$1: "error"$1)}' test-----如果第一個域大于5則打印問號后面的表達式值,否則打印冒號后面的表達式值。

$ awk '/^root/,/^mysql/' test----打印以正則表達式root開頭的記錄到以正則表達式mysql開頭的記錄范圍內(nèi)的所有記錄。如果找到一個新的正則表達式root開頭的記錄,則繼續(xù)打印直到下一個以正則表達式mysql開頭的記錄為止,或到文件末尾。

14. awk編程
14.1. 變量
在awk中,變量不需要定義就可以直接使用,變量類型可以是數(shù)字或字符串。

賦值格式:Variable = expression,如$ awk '$1 ~/test/{count = $2 + $3; print count}' test,上式的作用是,awk先掃描第一個域,一旦test匹配,就把第二個域的值加上第三個域的值,并把結(jié)果賦值給變量count,最后打印出來。

awk可以在命令行中給變量賦值,然后將這個變量傳輸給awk腳本。如$ awk -F: -f awkscript month=4 year=2004 test,上式的month和year都是自定義變量,分別被賦值為4和2004。在awk腳本中,這些變量使用起來就象是在腳本中建立的一樣。注意,如果參數(shù)前面出現(xiàn)test,那么在BEGIN語句中的變量就不能被使用。

域變量也可被賦值和修改,如$ awk '{$2 = 100 + $1; print }' test,上式表示,如果第二個域不存在,awk將計算表達式100加$1的值,并將其賦值給$2,如果第二個域存在,則用表達式的值覆蓋$2原來的值。再例如:$ awk '$1 == "root"{$1 ="test";print}' test,如果第一個域的值是“root”,則把它賦值為“test”,注意,字符串一定要用雙引號。

內(nèi)建變量的使用。變量列表在前面已列出,現(xiàn)在舉個例子說明一下。$ awk -F: '{IGNORECASE=1; $1 == "MARY"{print NR,$1,$2,$NF}'test,把IGNORECASE設(shè)為1代表忽略大小寫,打印第一個域是mary的記錄數(shù)、第一個域、第二個域和最后一個域。

14.2. BEGIN模塊
BEGIN模塊后緊跟著動作塊,這個動作塊在awk處理任何輸入文件之前執(zhí)行。所以它可以在沒有任何輸入的情況下進行測試。它通常用來改變內(nèi)建變量的值,如OFS,RS和FS等,以及打印標(biāo)題。如:$ awk 'BEGIN{FS=":"; OFS="\t"; ORS="\n\n"}{print $1,$2,$3} test。上式表示,在處理輸入文件以前,域分隔符(FS)被設(shè)為冒號,輸出文件分隔符(OFS)被設(shè)置為制表符,輸出記錄分隔符(ORS)被設(shè)置為兩個換行符。$ awk 'BEGIN{print "TITLE TEST"}只打印標(biāo)題。

14.3. END模塊
END不匹配任何的輸入文件,但是執(zhí)行動作塊中的所有動作,它在整個輸入文件處理完成后被執(zhí)行。如$ awk 'END{print "The number of records is" NR}' test,上式將打印所有被處理的記錄數(shù)。

14.4. 重定向和管道
awk可使用shell的重定向符進行重定向輸出,如:$ awk '$1 = 100 {print $1 > "output_file" }' test。上式表示如果第一個域的值等于100,則把它輸出到output_file中。也可以用>>來重定向輸出,但不清空文件,只做追加操作。

輸出重定向需用到getline函數(shù)。getline從標(biāo)準(zhǔn)輸入、管道或者當(dāng)前正在處理的文件之外的其他輸入文件獲得輸入。它負責(zé)從輸入獲得下一行的內(nèi)容,并給NF,NR和FNR等內(nèi)建變量賦值。如果得到一條記錄,getline函數(shù)返回1,如果到達文件的末尾就返回0,如果出現(xiàn)錯誤,例如打開文件失敗,就返回-1。如:

$ awk 'BEGIN{ "date" | getline d; print d}' test。執(zhí)行l(wèi)inux的date命令,并通過管道輸出給getline,然后再把輸出賦值給自定義變量d,并打印它。

$ awk 'BEGIN{"date" | getline d; split(d,mon); print mon[2]}' test。執(zhí)行shell的date命令,并通過管道輸出給getline,然后getline從管道中讀取并將輸入賦值給d,split函數(shù)把變量d轉(zhuǎn)化成數(shù)組mon,然后打印數(shù)組mon的第二個元素。

$ awk 'BEGIN{while( "ls" | getline) print}',命令ls的輸出傳遞給geline作為輸入,循環(huán)使getline從ls的輸出中讀取一行,并把它打印到屏幕。這里沒有輸入文件,因為BEGIN塊在打開輸入文件前執(zhí)行,所以可以忽略輸入文件。

$ awk 'BEGIN{printf "What is your name?"; getline name < "/dev/tty" } $1 ~name {print "Found" name on line ", NR "."} END{print "See you," name "."} test。在屏幕上打印”What is your name?",并等待用戶應(yīng)答。當(dāng)一行輸入完畢后,getline函數(shù)從終端接收該行輸入,并把它儲存在自定義變量name中。如果第一個域匹配變量name的值,print函數(shù)就被執(zhí)行,END塊打印See you和name的值。

$ awk 'BEGIN{while (getline < "/etc/passwd" > 0) lc++; print lc}'。awk將逐行讀取文件/etc/passwd的內(nèi)容,在到達文件末尾前,計數(shù)器lc一直增加,當(dāng)?shù)侥┪矔r,打印lc的值。注意,如果文件不存在,getline返回-1,如果到達文件的末尾就返回0,如果讀到一行,就返回1,所以命令 while (getline < "/etc/passwd")在文件不存在的情況下將陷入無限循環(huán),因為返回-1表示邏輯真。

可以在awk中打開一個管道,且同一時刻只能有一個管道存在。通過close()可關(guān)閉管道。如:$ awk '{print $1, $2 | "sort" }' test END {close("sort")}。awd把print語句的輸出通過管道作為linux命令sort的輸入,END塊執(zhí)行關(guān)閉管道操作。

system函數(shù)可以在awk中執(zhí)行l(wèi)inux的命令。如:$ awk 'BEGIN{system("clear")'。

fflush函數(shù)用以刷新輸出緩沖區(qū),如果沒有參數(shù),就刷新標(biāo)準(zhǔn)輸出的緩沖區(qū),如果以空字符串為參數(shù),如fflush(""),則刷新所有文件和管道的輸出緩沖區(qū)。

14.5. 條件語句
awk中的條件語句是從C語言中借鑒過來的,可控制程序的流程。

14.5.1. if語句
格式:
        {if (expression){
                   statement; statement; ...
                     }
        }
$ awk '{if ($1 <$2) print $2 "too high"}' test。如果第一個域小于第二個域則打印。

$ awk '{if ($1 < $2) {count++; print "ok"}}' test.如果第一個域小于第二個域,則count加一,并打印ok。

14.5.2. if/else語句,用于雙重判斷。
格式:
        {if (expression){
                   statement; statement; ...
                       }
        else{
                   statement; statement; ...
                       }
        }
$ awk '{if ($1 > 100) print $1 "bad" ; else print "ok"}' test。如果$1大于100則打印$1 bad,否則打印ok。

$ awk '{if ($1 > 100){ count++; print $1} else {count--; print $2}' test。如果$1大于100,則count加一,并打印$1,否則count減一,并打印$1。

14.5.3. if/else else if語句,用于多重判斷。
格式:
        {if (expression){
                    statement; statement; ...
                   }
        else if (expression){
                    statement; statement; ...
                   }
        else if (expression){
                    statement; statement; ...
                   }
        else {
                   statement; statement; ...
             }
        }
14.6. 循環(huán)
awk有三種循環(huán):while循環(huán);for循環(huán);special for循環(huán)。

$ awk '{ i = 1; while ( i <= NF ) { print NF,$i; i++}}' test。變量的初始值為1,若i小于可等于NF(記錄中域的個數(shù)),則執(zhí)行打印語句,且i增加1。直到i的值大于NF.

$ awk '{for (i = 1; i<NF; i++) print NF,$i}' test。作用同上。

breadkcontinue語句。break用于在滿足條件的情況下跳出循環(huán);continue用于在滿足條件的情況下忽略后面的語句,直接返回循環(huán)的頂端。如:

{for ( x=3; x<=NF; x++) 
            if ($x<0){print "Bottomed out!"; break}}
{for ( x=3; x<=NF; x++)
            if ($x==0){print "Get next item"; continue}}

next語句從輸入文件中讀取一行,然后從頭開始執(zhí)行awk腳本。如:

{if ($1 ~/test/){next}
    else {print}
}

exit語句用于結(jié)束awk程序,但不會略過END塊。退出狀態(tài)為0代表成功,非零值表示出錯。

14.7. 數(shù)組
awk中的數(shù)組的下標(biāo)可以是數(shù)字和字母,稱為關(guān)聯(lián)數(shù)組。

14.7.1. 下標(biāo)與關(guān)聯(lián)數(shù)組
用變量作為數(shù)組下標(biāo)。如:$ awk {name[x++]=$2};END{for(i=0;i<NR;i++) print i,name[i]}' test。數(shù)組name中的下標(biāo)是一個自定義變量x,awk初始化x的值為0,在每次使用后增加1。第二個域的值被賦給name數(shù)組的各個元素。在END模塊中,for循環(huán)被用于循環(huán)整個數(shù)組,從下標(biāo)為0的元素開始,打印那些存儲在數(shù)組中的值。因為下標(biāo)是關(guān)健字,所以它不一定從0開始,可以從任何值開始。

special for循環(huán)用于讀取關(guān)聯(lián)數(shù)組中的元素。格式如下:

{for (item in arrayname){
         print arrayname[item]
         }
}

$ awk '/^tom/{name[NR]=$1}; END{for(i in name){print name[i]}}' test。打印有值的數(shù)組元素。打印的順序是隨機的。 
用字符串作為下標(biāo)。如:count["test"]

用域值作為數(shù)組的下標(biāo)。一種新的for循環(huán)方式,for (index_value in array) statement。如:$ awk '{count[$1]++} END{for(name in count) print name,count[name]}' test。該語句將打印$1中字符串出現(xiàn)的次數(shù)。它首先以第一個域作數(shù)組count的下標(biāo),第一個域變化,索引就變化。

delete函數(shù)用于刪除數(shù)組元素。如:$ awk '{line[x++]=$1} END{for(x in line) delete(line[x])}' test。分配給數(shù)組line的是第一個域的值,所有記錄處理完成后,special for循環(huán)將刪除每一個元素。

14.8. awk的內(nèi)建函數(shù)
14.8.1. 字符串函數(shù)
sub函數(shù)匹配記錄中最大、最靠左邊的子字符串的正則表達式,并用替換字符串替換這些字符串。如果沒有指定目標(biāo)字符串就默認(rèn)使用整個記錄。替換只發(fā)生在第一次匹配的時候。格式如下:

            sub (regular expression, substitution string):
            sub (regular expression, substitution string, target string)

實例:

            $ awk '{ sub(/test/, "mytest"); print }' testfile
            $ awk '{ sub(/test/, "mytest"); $1}; print }' testfile

第一個例子在整個記錄中匹配,替換只發(fā)生在第一次匹配發(fā)生的時候。如要在整個文件中進行匹配需要用到gsub

第二個例子在整個記錄的第一個域中進行匹配,替換只發(fā)生在第一次匹配發(fā)生的時候。

相關(guān)文章

  • php格式化工具Beautify PHP小小BUG

    php格式化工具Beautify PHP小小BUG

    Beautify PHP is written entirely in PHP. The program was tested with Linux and Windows, PHP 4.1.0 and PHP 4.3.1, but it should work on most systems running PHP.
    2008-04-04
  • 8個出色的WordPress SEO插件收集

    8個出色的WordPress SEO插件收集

    以下是幾個一流的SEO插件列表,它們可以幫助我們提高WordPress站點在搜索引擎中的排名。
    2011-02-02
  • 什么是phpDocumentor

    什么是phpDocumentor

    PHPDocumentor是一個用PHP寫的工具,對于有規(guī)范注釋的php程序,它能夠快速生成具有相互參照,索引等功能的API文檔。
    2008-09-09
  • 各種快遞查詢--Api接口

    各種快遞查詢--Api接口

    目前支持申通快遞查詢接口、圓通快遞查詢API、中通快遞、韻達快遞、匯通快遞、EMS快遞、順豐快遞、天天快遞、宅急送快遞等國內(nèi)常見快遞,同時也支持TNT快遞、FedEx快遞、DHL快遞、UPS快遞等國外常見快遞的查詢服務(wù)共計支持100余家快遞,覆蓋了市面95%以上的使用群體。
    2016-04-04
  • 建站常用13種PHP開源CMS比較

    建站常用13種PHP開源CMS比較

    dedecms很好用,建立模板也很方便,代碼也合理,相對其它CMS要好得多,最為關(guān)鍵的是開源。,現(xiàn)在網(wǎng)上最熱門,已經(jīng)有不少大站在使用這個CMS了,中國站長站就是使用的這個CMS。
    2009-08-08
  • 怎樣去閱讀一份php源代碼

    怎樣去閱讀一份php源代碼

    技術(shù)的快速進步,最好的途徑就是閱讀源代碼了。自己也閱讀了很多開源的程序,感覺方法很重要,好的方法可以達到事半功倍的效果。一下就是我自己的一些新的,希望對大家都有用。
    2009-08-08
  • PHP 開源AJAX框架14種

    PHP 開源AJAX框架14種

    PHP 開源AJAX框架14種,需要的朋友可以參考下,學(xué)習(xí)。
    2009-08-08
  • PHP5.2下chunk_split()函數(shù)整數(shù)溢出漏洞 分析

    PHP5.2下chunk_split()函數(shù)整數(shù)溢出漏洞 分析

    PHP5.2下chunk_split()函數(shù)整數(shù)溢出漏洞 分析...
    2007-06-06
  • mysql,mysqli,PDO的各自不同介紹

    mysql,mysqli,PDO的各自不同介紹

    PDO,MYSQL,MYSQLI 性能哪個比較好,普通的mysql連接肯定是會被拋棄的 因為每次都要防止sql注入的問題 而且相對來說比較慢
    2012-09-09
  • dedecms系統(tǒng)常用術(shù)語匯總

    dedecms系統(tǒng)常用術(shù)語匯總

    dedecms系統(tǒng)常用術(shù)語匯總...
    2007-04-04

最新評論