9. 匹配操作符(~)
用來在記錄或者域內匹配正規表示式。如gawk.exe "$1 ~/^root/" test.txt將顯示test檔案第一列中以root開頭的行。
10. 比較表示式
conditional expression_r1 ? expression_r2: expression_r3,例如:gawk.exe " ? $1: $3: print max}" test。如果第乙個域大於第三個域,$1就賦值給max,否則$3就賦值給max。
gawk.exe "$1 + $2 < 100" test。如果第一和第二個域相加大於100,則列印這些行。
gawk.exe "$1 > 5 && $2 < 10" test,如果第乙個域大於5,並且第二個域小於10,則列印這些行。
11. 範圍模板
範圍模板匹配從第乙個模板的第一次出現到第二個模板的第一次出現之間所有行。如果有乙個模板沒出現,則匹配到開頭或末尾。如gawk.exe "/root/,/mysql/" test將顯示root第一次出現到mysql第一次出現之間的所有行。
13. 幾個例項
*gawk.exe "/^(no|so)/" test.txt-----列印所有以模式no或so開頭的行。
*gawk.exe "/^[ns]/" test.txt -----如果記錄以n或s開頭,就列印這個記錄。
*gawk.exe "$1 ~/[0-9][0-9]$/(print $1)" test.txt -----如果第乙個域以兩個數字結束就列印這個記錄。
*gawk.exe "$1 == 100 || $2 < 50" test.txt -----如果第乙個或等於100或者第二個域小於50,則列印該行。
*gawk.exe "$1 != 10" test.txt -----如果第乙個域不等於10就列印該行。
*gawk.exe "/test/" test.txt -----如果記錄包含正規表示式test,則第乙個域加10並列印出來。
*gawk.exe "" test.txt -----如果第乙個域大於5則列印問號後面的表示式值,否則列印冒號後面的表示式值。
*gawk.exe "/^root/,/^mysql/" test.txt ----列印以正規表示式root開頭的記錄到以正規表示式mysql開頭的記錄範圍內的所有記錄。如果找到乙個新的正規表示式root開頭的記錄,則繼續列印直到下乙個以正規表示式mysql開頭的記錄為止,或到檔案末尾。
14.gawk程式設計
14.1. 變數
*在gawk中,變數不需要定義就可以直接使用,變數型別可以是數字或字串。
*賦值格式:variable = expression_r,如gawk.exe "$1 ~/test/" test.txt,上式的作用是,gawk先掃瞄第乙個域,一旦test匹配,就把第二個域的值加上第三個域的值,並把結果賦值給變數count,最後列印出來。
*gawk 可以在命令列中給變數賦值,然後將這個變數傳輸給gawk指令碼。如gawk.exe –f」:」 -f awkscript month=4 year=2004 test,上式的month和year都是自定義變數,分別被賦值為4和2004。在awk指令碼中,這些變數使用起來就象是在指令碼中建立的一樣。注意,如果引數前面出現test,那麼在begin語句中的變數就不能被使用。
*域變數也可被賦值和修改,如gawk.exe "" test.txt,上式表示,如果第二個域不存在,gawk將計算表示式100加$1的值,並將其賦值給$2,如果第二個域存在,則用表示式的值覆蓋$2原來的值。再例如:gawk.exe "$1 == "root"" test.txt,如果第乙個域的值是「root」,則把它賦值為「test」,注意,字串一定要用雙引號。
*內建變數的使用。變數列表在前面已列出,現在舉個例子說明一下。gawk.exe -f: ""test,把ignorecase設為1代表忽略大小寫,列印第乙個域是mary的記錄數、第乙個域、第二個域和最後乙個域。
14.2. begin模組
begin 模組後緊跟著動作塊,這個動作塊在awk處理任何輸入檔案之前執行。所以它可以在沒有任何輸入的情況下進行測試。它通常用來改變內建變數的值,如ofs, rs和fs等,以及列印標題。如:gawk.exe "begin test.txt。上式表示,在處理輸入檔案以前,域分隔符(fs)被設為冒號,輸出檔案分隔符(ofs)被設定為製表符,輸出記錄分隔符(ors)被設定為兩個換行符。gawk.exe "begin只列印標題。
14.3. end模組
end不匹配任何的輸入檔案,但是執行動作塊中的所有動作,它在整個輸入檔案處理完成後被執行。如gawk.exe "end" test.txt,上式將列印所有被處理的記錄數。
14.4. 重定向和管道
*awk 可使用shell的重定向符進行重定向輸出,如:gawk.exe "$1 = 100 " test.txt。上式表示如果第乙個域的值等於100,則把它輸出到output_file中。也可以用》來重定向輸出,但不清空檔案,只做追加操作。
*輸出重定向需用到getline函式。getline從標準輸入、管道或者當前正在處理的檔案之外的其他輸入檔案獲得輸入。它負責從輸入獲得下一行的內容,並給nf,nr和fnr等內建變數賦值。如果得到一條記錄,getline函式返回1,如果到達檔案的末尾就返回0,如果出現錯誤,例如開啟檔案失敗,就返回-1。如:
gawk.exe "begin" test.txt。執行linux的date命令,並通過管道輸出給getline,然後再把輸出賦值給自定義變數d,並列印它。
gawk.exe "begin" test。執行shell的date命令,並通過管道輸出給getline,然後getline從管道中讀取並將輸入賦值給d,split函式把變數d轉化成陣列mon,然後列印陣列mon的第二個元素。
gawk.exe "begin",命令ls的輸出傳遞給geline作為輸入,迴圈使getline從ls的輸出中讀取一行,並把它列印到螢幕。這裡沒有輸入檔案,因為 begin塊在開啟輸入檔案前執行,所以可以忽略輸入檔案。
gawk.exe "begin $1 ~name end test.txt。在螢幕上列印」what is your name?",並等待使用者應答。當一行輸入完畢後,getline函式從終端接收該行輸入,並把它儲存在自定義變數name中。如果第乙個域匹配變數 name的值,print函式就被執行,end塊列印see you和name的值。
gawk.exe "begin"。awk將逐行讀取檔案/etc/passwd的內容,在到達檔案末尾前,計數器lc一直增加,當到末尾時,列印lc的值。注意,如果檔案不存在,getline返回-1,如果到達檔案的末尾就返回0,如果讀到一行,就返回1,所以命令 while (getline < "/etc/passwd")在檔案不存在的情況下將陷入無限迴圈,因為返回-1表示邏輯真。
*可以在awk中開啟乙個管道,且同一時刻只能有乙個管道存在。通過close()可關閉管道。如:gawk.exe "" test end 。awd把print語句的輸出通過管道作為linux命令sort的輸入,end塊執行關閉管道操作。
*system函式可以在awk中執行linux的命令。如:gawk.exe "begin{system("clear")"。
*fflush函式用以重新整理輸出緩衝區,如果沒有引數,就重新整理標準輸出的緩衝區,如果以空字串為引數,如fflush(""),則重新整理所有檔案和管道的輸出緩衝區。
Windows上GAWK的使用 二
gawk內建環境變數 變數 描述 n 當前記錄的第n個字段,欄位間由fs分隔。0 完整的輸入記錄。argc 命令列引數的數目。argind 命令列中當前檔案的位置 從0開始算 argv 包含命令列引數的陣列。convfmt 數字轉換格式 預設值為 6g environ 環境變數關聯陣列。errno ...
Windows上GAWK的使用 五
14.8.gawk的內建函式 14.8.1.字串函式 sub函式匹配記錄中最大 最靠左邊的子字串的正規表示式,並用替換字串替換這些字串。如果沒有指定目標字串就預設使用整 個記錄。替換只發生在第一次匹配的時候。格式如下 sub regular expression r,substitution str...
Windows上GAWK的使用 一
現在經常要處理到一些日誌資料,對這些資料進行分析處理,但首先要對日誌資料進行etl處理,如果簡單的資料格式處理,使用gawk是最理想不過了,下面我們就介紹如何使用gawk,對資料進行e extract 處理。二.gawk的基本語法.1.gawk格式.gawk options begin patter...