正則表達式中awk的學習和使用

 AWK是一種優良的文本處理工具。它不僅是linux中也是任何環境中現有的功能最強大的數據處理引擎之一。這種編程及數據庫訪問語言(其名稱得自於它的創始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首個字母)的最大功能取決於一個人所擁有的知識
一、AWK的用法:
1、在命令行模式的直接使用。 格式爲: awk ‘pattern {action}’
2、將awk命令寫入腳本,並以#!/bin/awk -f命令解釋器作爲腳本的首行,設置腳本的可執行權限,通過鍵入腳本名稱來調用它。格式爲./testscript.awk filename。等同於shell腳本的方法。
3、將awk命令插入一個單獨文件然後執行。格式爲 awk -f awkscript filename
第一種格式常見的是awk 'BEGIN {print "this is the start"}{print $1,$2,$3}END{print "this is the end"}' filename。其中BEGIN和END中間是模式,END後是動作。BEGIN和END可以省去,模式一般是匹配搜索使用
二、AWK排查錯誤常見的問題
1、確保整個AWK用單引號括起來;2、確保單引號內所有的括號或引號成對出現;3、確保用大括號括起動作語句,用小括號括起條件語句;4有時候要檢查是否有文件名或者BEGIN等
三、AWK內置字符串變量函數

gsub(r,s)
在整個$0中用s代替r
gsub(r,s,t)
整個t中用s替代r
index(s,t)
返回s中字符串t的第一位置
length(s)
返回s長度
match(s,r)
測試s是否包含匹配r的字符串
split(s,a,fs)
在fs上將s分成序列a,放在數組a裏。返回段數的數值
sprint(fmt,exp)
返回經fmt格式化後的exp
sub(r,s)
用$0中最左邊最長的子串代替s
substr(s,p)
返回字符串s中從p開始的後綴部分
substr(s,p,n)
返回字符串s中從p開始長度爲n的後綴部分

四、AWK的內置環境變量
$n 當前記錄的第n個字段,字段間由FS分隔。
$0 完整的輸入記錄。在文本中一般指行信息內容
ARGC 命令行參數的數目。
ARGIND 命令行中當前文件的位置(從0開始算)。
ARGV 包含命令行參數的數組。
CONVFMT 數字轉換格式(默認值爲%.6g)
ENVIRON 環境變量關聯數組。
ERRNO 最後一個系統錯誤的描述。
FIELDWIDTHS 字段寬度列表(用空格鍵分隔)。
FILENAME 當前文件名
FNR 同NR,但相對於當前文件。
FS 字段分隔符(默認是任何空格)。可以用戶指定
IGNORECASE 如果爲真,則進行忽略大小寫的匹配。
NF 當前記錄中的字段數。$NF指最後一個段內容
NR 當前記錄數。在文本中一般指多少行
OFMT 數字的輸出格式(默認值是%.6g)。
OFS 輸出字段分隔符(默認值是一個空格)。
ORS 輸出記錄分隔符(默認值是一個換行符)。
RLENGTH 由match函數所匹配的字符串的長度。
RS 記錄分隔符(默認是一個換行符)。
RSTART 由match函數所匹配的字符串的第一個位置。
SUBSEP 數組下標分隔符(默認值是\034)。
五、AWK內置操作符
= += -= *= /= %= ^= **= 賦值  如a+=10代表a+10
?: C條件表達式,a>b?a:b表示a大於b如爲真返回a,如爲假返回b
|| 邏輯或。只要一個爲真即爲真。
&& 邏輯與。只要一個爲假即爲假。需兩個同時爲真才爲真。
~ ~! 匹配正則表達式和不匹配正則表達式。經常針對文本搜索
< <= > >= != == 關係運算符
空格 連接
+ - 加,減
* / & 乘,除與求餘
+ - ! 一元加,減和邏輯非
^ *** 求冪
++ -- 增加或減少,作爲前綴或後綴。這個一定要區分清楚++a與a++
$ 字段引用
in 數組成員

六、AWK元字符:\(轉義字符)、^ $ [] | * + ?。其中+和?只能在AWK中使用不能再sed和grep中使用。+表示匹配一個或多個字符;?表示匹配0或1個字符。
 七、例子
俗話說,看的多不如動手多。讓我們來通過例子加深理解和記憶吧。練起來
1、awk '{if($1="I")print $0}'  greptest               ###表示如果第一個字段爲I就打印改行信息
2、awk '{if ($0~/good/)print $0}' greptest         ###如果哪行信息可以匹配good就打印哪行信息
3、awk '{if ($0~/^[^A-Za-z]/)print $0}' greptest  ###如果哪行行首是非字母就匹配哪行然後打印該行信息$0在這裏代表的是行信息內容。^平方號在[]大括號外表示行首,在內表示非
4、awk '{if($0~/good|gold/)print $0}' greptest  ###如果哪行匹配good或gold就打印改行內容

5、awk '{if($0~/go+/)print $0}' greptest         ###匹配g後一個或一個以上o字母。如good gold
6、awk '{if($0~/go?/)print $0}' greptest         ###匹配g後零個或一個字母o。如go、girl而不是good
7、awk '{if($5==1024)print $0}' llvar           ###匹配第五段(域)等於1024的行並打印該行
8、awk '{if($2<9 && $9~/o/)print $0}' llvar ###匹配第二段(域)小於9,並且第九段匹配字母o

9、awk '{print NF,NR,$NF,$0}' greptest    ###打印幾個段,行號,最後一個段內容,該行信息。其中NF表示默認以空格爲分割符分割爲幾個段;NR表示該行行號;FS表示分隔符賦值
10、awk '{print NF,NR,$NF,$0,FILENAME}' greptest  ###同上,FILENAME是文件名
11、awk 'BEGIN{FS=":"}{print NF,NR,$NF,$0}END{print FILENAME}'  /etc/passwd分隔符=冒號

12、awk 'BEGIN{a=3;a+=2;print a}'  ###答案是5。+=2的意思是加2等於,其他/=、%=同樣
13、awk 'BEGIN{a=3;b=4;a>b?b=a:a=b print a,b}'  答案是4,4。表示a大於b嗎,如是把a值賦給b
14、awk 'BEGIN{a=3;print --a;print a;print a--;print a}'   答案分別是2,2,2,1。注意a--的值。
15、awk 'BEGIN{a=3;print ++a;print a;print a++;print a}'  答案是4,4,4,5。同上一樣的道理。

16、awk 'sub("good","GOOD"){print $0}' greptest   ###每行匹配第一個good,然後替換爲GOOD
17、awk 'sub("ou","OU",$2){print $0}' greptest       ###匹配每行的第二段爲ou,然後替換成OU。
18、awk '{print index($0,"good"),$0}' greptest   ###查找good在行中是第幾位。返回數值。
19、awk '{print match($0,"good"),$0}greptest'  #該行是否包含good,如果包含返回在行中的位置
20、awk 'BEGIN{print split("0421-8888-666",aa,"-");print aa[1],aa[2],aa[3]}'  答案是3   0421  8888  666。split函是把字符串"0421-8888-666"用分隔符"-"分出來放在aa數組裏。返回值是多少段。
21、 awk 'BEGIN gsub("2","9"$5);{print $0}' greptest  ###替換每行中第五段凡是2的換爲9,g表全部
22、awk  'BEGIN {print substr($0,1,5)' greptest     ###取出每行的第一到第五位字符。
23、awk 'BEGIN {print sprintf("%10.4f",3.1415926)}'    ###答案是連續四個空格3.1416。表示是個字符,小數位數爲4位。默認使用右對齊格式,如用左對齊加"-"中劃線。如下例。
24、awk 'BEGIN {print sprintf("%-8d%-8i",123,4567)}'  答案是123五個空格4567四個空格
  如果上面的這些例子沒有BEGIN選項的要加入文件名,有文件名的可以省去BEGIN。可以試試上面的不加BEGIN是什麼效果,一旦執行 awk ' {print sprintf("%-8d%-8i",123,4567)}' (沒有BEGIN)提示符一直會等待輸入,敲回車會顯示結果但還是停在那兒等待輸入
25、
以下是一個awk的腳本,該腳本的目的主要是把/etc/passwd文件分段對齊。腳本先指定了一個分隔符,利用分隔符把/etc/passwd分成不同的段,然後使用格式輸出工具排序對齊。
  1. #!/bin/awk -f  
  2. #program:this script is used awk to see test* information from the passwd  
  3. #history:2013  
  4.  
  5. #begin to print  
  6. BEGIN{  
  7. FS=":" 
  8. print "======================================================="  
  9. print "Username \t Fullname \t UID \t GID \t User home \t shell"  
  10. print "======================================================="  
  11. }  
  12.  
  13. #printformt  
  14. {  
  15. printf("%-10s\t%-10s\t%5i\t%5i\t%-15s\t%-10s\n",$1,$5,$3,$4,$6,$7)  
  16. }  
  17.  
  18. #end  
  19. END{  
  20. print "++++++++++++++++++++++++++++++++++++++++++++++++++++++++"  
  21. print "this is "NR" user information"  

 以上腳本信息保存爲passwd.awk文件,並賦予執行權限。使用命令./passwd.awk /etc/passwd執行。顯示結果是按Username  Fullname  UID  GID  User home shell等順序排序格式對齊的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章