awk命令-轉整理_第1頁
awk命令-轉整理_第2頁
awk命令-轉整理_第3頁
awk命令-轉整理_第4頁
awk命令-轉整理_第5頁
已閱讀5頁,還剩4頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、awk命令詳解 (轉 整理)一、前言awk有3個不同版本: awk、nawk和gawk,未作特別說明,一般指gawk。awk語言的最基本功能是在文件或字符串中基于指定規則來分解抽取信息,也可以基于指定的規則來輸出數據。完整的awk腳本通常用來格式化文本文件中的信息。二、基本語法awk opion 'awk_script' input_file1 input_file2 .awk的常用選項option有: -F fs : 使用fs作為輸入記錄的字段分隔符,如果省略該選項,awk使用環境變量IFS的值 -f filename : 從文件filename中讀取awk_script -

2、v var=value : 為awk_script設置變量awk有三種運行方式:第一種,把awk的腳本命令直接放在命令中。第二種,把awk的所有的腳本命令放在一個腳本文件中,然后用-f選項來指定要運行的腳本命令文件。第三種,將awk_script放入腳本文件并以 #!/bin/awk -f 作為首行,給予該腳本可執行權限,然后在shell下通過鍵入該腳本的腳本名調用之。三、awk腳本awk腳本可以由一條或多條awk_cmd組成,對于多個awk_cmd,一個awk_cmd完成后,應該另起一行,以便進行隔。 awk_cmd由兩部分組成: awk_pattern actions 。另外,在awk命令

3、中直接使用awk_script時,awk_script也可以被分成多行書寫,但必須確保整個awk_script被單引號括起來。awk命令的一般形式:awk ' BEGIN actions awk_pattern1 actions .awk_patternN actions END actions ' inputfile其中 BEGIN actions 和 END actions 是可選的。在awk腳本中可以使用AWK本身內置變量,如下: ARGC 命令行變元個數ARGV 命令行變元數組FILENAME 當前輸入文件名FNR 當前文件中的記錄號FS 輸入域分隔符,默認為一個空格R

4、S 輸入記錄分隔符NF 當前記錄里域個數NR 到目前為止記錄數OFS 輸出域分隔符ORS 輸出記錄分隔符awk腳本的運行過程: 如果BEGIN 區塊存在,awk執行它指定的actions。 awk從輸入文件中讀取一行,稱為一條輸入記錄。(如果輸入文件省略,將從標準輸入讀取) awk將讀入的記錄分割成字段,將第1個字段放入變量$1中,第2個字段放入$2,以此類推。$0表示整條記錄。字段分隔符使用shell環境變量IFS或由參數指定。 把當前輸入記錄依次與每一個awk_cmd中awk_pattern比較,看是否匹配,如果相匹配,就執行對應的actions。如果不匹配,就跳過對應的actions,直

5、到比較完所有的awk_cmd。 當一條輸入記錄比較了所有的awk_cmd后,awk讀取輸入的下一行,繼續重復步驟和,這個過程一直持續,直到awk讀取到文件尾。 當awk讀完所有的輸入行后,如果存在END,就執行相應的actions。1)input_file可以是多于一個文件的文件列表,awk將按順序處理列表中的每個文件。2)一條awk_cmd的awk_pattern可以省略,省略時不對輸入記錄進行匹配比較就執行相應的actions。一條awk_cmd的actions 也可以省略,省略時默認的動作為打印當前輸入記錄,即print $0 。一條awk_cmd中的awk_pattern和action

6、s不能同時省略。3) BEGIN區塊和END區塊別位于awk_script的開頭和結尾。awk_script中只有END區塊或者只有BEGIN區塊是被允許的。如果awk_script中只有BEGIN actions ,awk不會讀取input_file。4) awk把輸入文件的數據讀入內存,然后操作內存中的輸入數據副本,awk不會修改輸入文件的內容。5) awk的總是輸出到標準輸出,如果想讓awk輸出到文件,可以使用重定向。3.1.awk_patternawk_pattern模式部分決定actions動作部分何時觸發及觸發actions。awk_pattern可以是以下幾種類型:1) 正則表達

7、式用作awk_pattern: /regexp/注意,正則表達式regexp必須被/包起來awk中正則表達式匹配操作中經常用到的字符: $ . | () * / :通用的regexp元字符+ : 匹配其前的單個字符一次以上,是awk自有的元字符,不適用于grep或sed等? : 匹配其前的單個字符1次或0次,是awk自有的元字符,不適用于grep或sed等關于正則表達式的更多內容請參正則表達式舉例:awk '/ *$0.0-90-9.*/' input_file比如,行內容為$0.99. helllo的行就可以和上面的正則表達式相配2) 布爾表達式用作awk_pattern,表

8、達式成立時,觸發相應的actions執行。 表達式中可以使用變量(如字段變量$1,$2等)和/regexp/ 布爾表達式中的操作符:關系操作符: < > <= >= = !=匹配操作符: value /regexp/ 如果value匹配/regexp/,則返回真value ! /regexp/ 如果value不匹配/regexp/,則返回真舉例: awk '$2 > 10 print "ok"' input_fileawk '$3 /d/ print "ok"' input_file &

9、;&(與) 和 |(或) 可以連接兩個/regexp/或者布爾表達式,構成混合表達式。!(非) 可以用于布爾表達式或者/regexp/之前。舉例: awk '($1 < 10 ) && ($2 > 10) print $0 "ok"' input_fileawk '/d/ | /x$/ print $0 "ok"' input_file 其它表達式用作awk_script,如賦值表達式等舉例: awk '(tot+=$6); ENDprint "total points

10、 :" tot ' input_file / 分號不能省略awk 'tot+=$6 print $0 ENDprint "total points :" tot ' input_file / 與上面等效當使用賦值表達式時,表示如果賦值后的變量是數字的話,如果為非0,就匹配,否則不匹配;如果為字符串的話,非空就為匹配,否則不匹配。awk內置字符串函數:gsub(r,s) 在整個$0中用s替代rawk 'gsub(/name/,"xingming") print $0' tempgsub(r,s,t) 在整個

11、t中用s替代rindex(s,t) 返回s中字符串t的第一位置awk 'BEGIN print index("Sunny","ny")' temp 返回4length(s) 返回s的長度match(s,r) 測試s是否包含匹配r的字符串awk '$1="J.Lulu" print match($1,"u")' temp 返回4split(s,a,fs) 在fs上將s分成序列aawk 'BEGIN print split("12#345#6789",myar

12、ray,"#")"'返回3,同時myarray1="12", myarray2="345", myarray3="6789"sprint(fmt,exp) 返回經fmt格式化后的expsub(r,s) 從$0中最左邊最長的子串中用s代替r(只更換第一遇到的匹配字符串)substr(s,p) 返回字符串s中從p開始的后綴部分substr(s,p,n) 返回字符串s中從p開始長度為n的后綴部分awk字符串連接操作 chengmocentos5 $ awk 'BEGINa="a&quo

13、t;b="b"c=(a""b);print c' ab 2.7. printf函數的使用:字符轉換: echo "65" |awk 'printf "%cn",$0' 輸出A awk 'BEGIN printf "%fn",999' 輸出999.000000格式化輸出:awk 'printf "%-15s %sn",$1,$3' temp 將第一個域全部左對齊顯示2.8. 其他awk用法: 向一行awk命令傳值:awk

14、'if ($5who | awk 'if ($1=user) print $1 " are in " $2 ' user=$LOGNAME 使用環境變量awk腳本命令:開頭使用 !/bin/awk -f ,如果沒有這句話自含腳本將不能執行,例子:!/bin/awk -f# all comment lines must start with a hash '#'# name: student_tot.awk# to call: student_tot.awk grade.txt# prints total and average of

15、club student points# print a header firstBEGINprint "Student Date Member No. Grade Age Points Max"print "Name Joined Gained Point Available"print"="# let's add the scores of points gained(tot+=$6);# finished processing now let's print the total and average point

16、END print "Club student total points :" tot print "Average Club Student points :" tot/N2.9. awk數組:awk的循環基本結構For (element in array) print arrayelementawk 'BEGIN record="123#456#789"split(record,myarray,"#") END for (i in myarray) print myarrayi 3.0 awk中自定義語

17、句一.條件判斷語句(if)if(表達式) #if ( Variable in Array )語句1else語句2格式中"語句1"可以是多個語句,如果你為了方便Unix awk判斷也方便你自已閱讀,你最好將多個語句用括起來。Unix awk分枝結構允許嵌套,其格式為:if(表達式)語句1else if(表達式)語句2else語句3chengmolocalhost nginx# awk 'BEGIN test=100;if(test>90) print "very good"else if(test>60) print "goo

18、d"else print "no pass"'very good 每條命令語句后面可以用“;”號結尾。 二.循環語句(while,for,do)1.while語句格式:while(表達式)語句例子:chengmolocalhost nginx# awk 'BEGIN test=100;total=0;while(i<=test) total+=i; i+;print total;'50502.for 循環for循環有兩種格式:格式1:for(變量 in 數組)語句例子:chengmolocalhost nginx# awk '

19、BEGIN for(k in ENVIRON) print k"="ENVIRONk;'AWKPATH=.:/usr/share/awkOLDPWD=/home/web97SSH_ASKPASS=/usr/libexec/openssh/gnome-ssh-askpassSELINUX_LEVEL_REQUESTED=SELINUX_ROLE_REQUESTED=LANG=zh_CN.GB2312。說明:ENVIRON 是awk常量,是子典型數組。格式2:for(變量;條件;表達式)語句例子:chengmolocalhost nginx# awk 'BEGI

20、N total=0;for(i=0;i<=100;i+) total+=i;print total;'50503.do循環格式:do語句while(條件)例子:chengmolocalhost nginx# awk 'BEGIN total=0;i=0;do total+=i; i+;while(i<=100)print total;'5050 以上為awk流程控制語句,從語法上面大家可以看到,與c語言是一樣的。有了這些語句,其實很多shell程序都可以交給awk,而且性能是非??斓?。break 當 break 語句用于 while 或 for 語句時,導致

21、退出程序循環。 continue 當 continue 語句用于 while 或 for 語句時,使程序循環移動到下一個迭代。 next 能能夠導致讀入下一個輸入行,并返回到腳本的頂部。這可以避免對當前輸入行執行其他的操作過程。 exit 語句使主輸入循環退出并將控制轉移到END,如果END存在的話。如果沒有定義END規則,或在END中應用exit語句,則終止腳本的執行。 NR與FNR:QUOTE:Aawk對多輸入文件的執行順序是,先將代碼作用于第一個文件(一行行讀入),然后該重復的代碼又作用于第二個文件,再作用于第三個文件。Bawk對多輸入文件的執行順序產生了行序號的問題。當第一個文件執行完

22、,下次讀入第二個文件,那么第二個文件的第一行怎么算呢?如果又計為1的話,那不就兩個1了么?(因為第一個文件也有第一行)。這就是NR和FNR的問題。 NR :全局行數(第二個文件的第一行接著第一個文件尾行數順序計數) FNR:當前文件自身的行數(不考慮前幾個輸入文件的自身行數及總數) 例如:data1.txt中有40行,data2.txt中有50行,那么awk data1.txt data2.txt NR 的值依次為:1,240,41,4290 FNR的值依次為:1,240, 1, 250 getline函數說明:awk 的 getline語句用于簡單地讀取一條記錄。如果用戶有一個數據記錄類似兩

23、個物理記錄,那么getline將尤其有用。它完成一般字段的分離(設置字段變量$0 FNR NF NR)。如果成功則返回1,失敗則返回0(到達文件尾)。QUOTE:Agetline從整體上來說,應這么理解它的用法: 當其左右無重定向符 | 或 < 時,getline作用于當前文件,讀入當前文件的第一行給其后跟的變量 var 或$0(無變量);應該注意到,由于awk在處理getline之前已經讀入了一行,所以getline得到 的返回結果是隔行的。 當其左右有重定向符 | 或 < 時,getline則作用于定向輸入文件,由于該文件是剛打開,并沒有被 awk讀入一行,只是getline讀入,那么getline返回的是該文件的第一行,而不是隔行。Bgetline用法大致可分為三大類(每大類又分兩小類),即總共有6種用法。代碼如下:QUOTE:nawk BEGIN“cat data.txt”|getline d; print d data2.txt nawk BEGIN“cat data.txt”|getline; print $0 data2.txtnawk BEGINgetline d < “data.txt”

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論