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