正則表達式之awk學習筆記

awk正則表達式學習筆記


AWK是一個優良的文本處理工具,Linux及Unix環境中現有的功能最強大的數據處理引擎之一。這種編程及數據操作語言(其名稱得

自於它的創始人阿爾佛雷德·艾侯、彼得·溫伯格和布萊恩·柯林漢姓氏的首個字母)的最大功能取決於一個人所擁有的知識。在最初

創造 AWK 時,其目的是用於文本處理,並且這種語言的基礎是,只要在輸入數據中有模式匹配,就執行一系列指令。該實用工具掃

描文件中的每一行,查找與命令行中所給定內容相匹配的模式。如果發現匹配內容,則進行下一個編程步驟。如果找不到匹配內容,

則繼續處理下一行。


gawk 是 AWK 的 GNU 版本。


注:sed和awk都是流式編輯器,是針對文檔的行來操作的。


匹配:

awk -F ':' '{print $3,$4}' 1.txt 


awk -F ':' 'OFS=":" {print $3,$4}' 1.txt   //通過OFS=":"用冒號對匹配的結果進行分隔。注意加等於號。

#當文本文檔某個段發生改變,文本文檔會以空格爲分隔符。如果想設置分隔符,就要使用OFS="".

awk -F ':' 'OFS="#" {print $3,$4}' 1.txt 


awk -F ':' 'OFS=":" {print $3,$4,$1}' 1.txt  //可以把$1放到最後。


awk  '/user/'  1.txt     //匹配User的行。


awk  '/user|root/'  1.txt    //匹配user或root的行。


awk  '/r*o/' 1.txt  


awk   '/r?o/' 1.txt   


awk   '/r+o/'  1.txt


awk   '/r.*o/' 1.txt     //貪婪匹配。


awk   '/(oo)+/'  1.txt    //一個或多個(oo).


grep -E  --color  'oo{2,10}' 1.txt   //grep和sed都支持花括號。


sed   -r  -n '/(oo){2,10}/'p  1.txt 


awk  -F ':'  '$1~/r*o/'  1.txt   //~表示去匹配的意思。用$1去匹配/r*o/.


awk  -F ':'  '$1~/r*o/  {print $3}'  1.txt  //用$1去匹配/r*o/,但只顯示第三段。


awk  -F ':'  '$1~/r*o/  {print $1,$3};$1~/user/ {print $1,$3}'  1.txt 


awk  -F ':'  '$1~/r*o/  {print $1,$3};$1~/nologin/ {print $1,$3}'  1.txt 


#awk和sed是流編輯器,表達式相當過濾器,每一行都從過濾器穿過,如果匹配就顯示出來。

#上述正則表達式有兩個表達式,相當於兩個過濾器。


awk  -F ':'  '$1~/r*o|nobody/  {print $1,$3}'  1.txt 


條件操作符:


awk -F ':' '$1=="root"'  1.txt


awk -F ':' '$1=="root" {print $1}'  1.txt


awk -F ':' '$1=="nobody" || $7 ~/false/'  1.txt


awk -F ':' '$1=="nobody" && $7 ~/false/'  1.txt


awk  -F ':' '$1>=500' 1.txt


awk  -F ':' 'int($1)>=500' 1.txt  //通過int()或*1,使$1被當成一個數值。


awk  -F ':' '$3>=“500”' 1.txt   //500加上雙引號後,$3會通過ASC碼的方式去排序。6也會被顯示出來,因爲它的ASC碼值比5大。


awk  -F":"   '$7!="/sbin/nologin" ' 1.txt


awk  -F":"   '$7!~/nolog/' 1.txt   //$7不匹配nolog.


awk  -F ':'  '$3<$4' 1.txt


awk  -F ':'   '$3==$4'  1.txt


awk  -F ':'   '$3=$4'  1.txt  //把$4的值賦給$3.


awk  -F ':'   'OFS=":";$3=$4'  1.txt


awk  -F ':'   'OFS=":";{if($3>100) $7=$3+$4}'  1.txt

內置變量:


awk  -F ':'  'NR<10' 1.txt  //NR表示行。


awk  -F ':'  'NR<10' 1.txt  


awk  -F ':'  'NR==10' 1.txt  


awk  -F ':'  'NR==10 {print $1,$5}' 1.txt


awk  -F ':'  '{if(NR==10) print $1,$5}' 1.txt


awk  -F ':'  'OFS=":" {if(NR==10) print $1,$5}' 1.txt


awk  -F ':'  '{print NF}' 1.txt  //NF表示段。


awk  -F ':'  '{if(NF==7) print $1}' 1.txt  


awk  -F ':'  '{print $NR,$NF}' 1.txt 


awk  -F ':'  '{print $7=$3+$4}' 1.txt 


awk  -F ':'  '$7=$3+$4' 1.txt 


awk  -F ':'  'OFS=":" $7=$3+$4' 1.txt 


awk  -F ':'  'OFS=":" {$7=$3+$4 ;print $0}' 1.txt

#賦值&&判斷語句放到花括號內部,OFS放到花括號外部。


awk  -F":"  '{(sum=sum+$3)};{print sum}' 1.txt  //等價於awk  -F":"  '{(sum+=$3)};{print sum}' 1.txt


awk  -F":"  '{(sum=sum+$3)};END{print sum}' 1.txt //END表示循環結束。

截取文檔中的某個段 :

-F //指定分隔符,如不加-F去指定,則默認以空格或TAB進行分隔。

print //表示打印動作,用來打印某個字段,$1表示第一字段,$2表示第二字段,$0表示整行。


EG:

 awk -F ':' '{print $1}'   //在suse中無法以#、@等進行分隔。


 awk -F ':' '{print $0}'   //打印整行。


awk -F  ':'  '{PRINT $1“#”$2“#”$3“#”$4}'    //打印多個字段。#等分隔符用雙引號,單引號無效。




匹配字符或字符串:


awk -F ':'  '/root/'  test001.txt     //匹配root.


awk -F ':' '/root/ {print $1,$3}  /man/ {print $1,$3}'  test001.txt    //先匹配root,後匹配man.


條件操作符:


awk -F ':' '$3=="0"'  test001.txt   

awk -F ':' '$3=="0"   {print $3,$4}'  test001.txt


awk -F ':'  '$3>="500"  {print $3}'  test001.txt   //此結果並沒像預期所想一樣,500被當成字符了。


awk  -F ':'  '$7!="/bin/false"'   test001.txt      // !=爲不匹配。


awk  -F ':'  '$3>$4 {print $3,$4} ' test001.txt   


awk -F  ':'  '$3>"100"&&$3<"65535"  {print $3,$4}' test001.txt  //此結果並沒像預期所想一樣,數字被當成字符了。


awk -F  ':'  '$3>"5" ||$7!="/bin/bash"' test001.txt


awk的內置變量


awk常用的變量有:


NF  //用分隔符分隔後一共有多少段


NR  //行數


awk -F ':' '/root/ {print $NF}'  test001.txt


head -n3  test001.txt |awk -F ':' '{print NF}'


head -n3  test001.txt |awk -F ':' '{print NR}'


可以使用行號作爲判斷條件:


awk  -F ':' 'NR>10' test001.txt


awk中的數學運算 


awk可以把段值更改:


head -n3 test001.txt |awk -F ':' '$1="root"'


awk還可以對各個段的值進行數學運算:


head -n3 test001.txt |awk -F ':'  '$7=$3+$4 {print $3,$4,$7}'


當然還可以計算某個段的總和


awk -F ':' '{(sum=sum+$3)};END{print sum}' test001.txt


awk -F ':' '{if($1=="root")print $0}' test001.txt



用awk 打印整個test.txt (以下操作都是用awk工具實現,針對test001.txt)

 awk -F ':' '{print $0}' test001.txt

查找所有包含 ‘bash’ 的行 

awk -F ':' '/bash/' test001.txt

用 ‘:’ 作爲分隔符,查找第三段等於0的行 

awk -F ':' '$3==0 ' test001.txt

用 ‘:’ 作爲分隔符,查找第一段爲 ‘root’ 的行,並把該段的 ‘root’ 換成 ‘toor’ (可以連同sed一起使用)

awk -F ':' '$1=="root"'  test001.txt|sed 's/root/toor/g'

用 ‘:’ 作爲分隔符,打印最後一段 

awk -F ':' '{print $NF}' test001.txt

打印行數大於20的所有行 

awk  -F ':' 'NR>20' test001.txt

用 ‘:’ 作爲分隔符,打印所有第三段小於第四段的行 

awk -F ':' '$3<$4' test001.txt

用 ‘:’ 作爲分隔符,打印第一段以及最後一段,並且中間用 ‘@’ 連接 (例如,第一行應該是這樣的形式 'root@/bin/bash‘ )

awk -F ':' '{print $1"@"$NF}' test001.txt 

用 ‘:’ 作爲分隔符,把整個文檔的第四段相加,求和 

awk -F ':' '{(sum=sum+$4)};END{print sum}' test001.txt


//cat bigip_gtm.conf  |grep wideip  |awk '{print $3}' |awk -F "/" '{print $3}' > /tmp/domain.txt















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