正則表達式git
正則表達式是你所定義的模式模板(pattern template),Linux工具能夠用它來過濾文本。Linux工具(好比sed編輯器或gawk程序)可以在處理數據時使用正則表達式對數據進行模式匹配。若是數據匹配模式,它就會被接受並進一步處理;若是數據不匹配模式,它就會被濾掉。正則表達式是經過正則表達式引擎(regular expression engine)實現的。正則表達式引擎是一套底層軟件,負責解釋正則表達式模式並使用這些模式進行文本匹配
兩種引擎正則表達式
POSIX基礎正則表達式(basic regular expression,BRE)引擎
POSIX擴展正則表達式(extended regular expression,ERE)引擎
sed 只符合BRE 規範,出於速度的考慮
gawk 用ERE 引擎
1、定義BRE 模式express
文本空格和正則表達式空格沒有區別sass
[root@localhost gawk]# echo "the test txt 1" |sed -n '/ 1/p' the test txt 1 [root@localhost gawk]#
特殊字符串bash
.*[]^${}\+?|()
#再找這些字符串時須要進行過濾
[root@localhost gawk]# echo "$ 3 the" |sed -n '/\$/p' $ 3 the [root@localhost gawk]#
錨字符編輯器
脫字符(^)定義從數據流中文本行的行首開始的模式。若是模式出如今行首以外的位置,正則表達式模式則沒法匹配
跟在行首查找模式相反的就是在行尾查找。特殊字符美圓符($)定義了行尾錨點。將這個特殊字符放在文本模式以後來指明數據行必須以該文本模式結尾。
組合錨定工具
[root@localhost gawk]# cat data1 test text the cost is $4.0 [root@localhost gawk]# sed -n '/^test text$/p' data1 test text [root@localhost gawk]#
點號字符測試
特殊字符點號用來匹配除換行符以外的任意單個字符。
[root@localhost gawk]# cat data1 test text the cost is $4.0 the cost isis $4.0 is cost $4.0 [root@localhost gawk]# sed -n '/.is/p' data1 #正則表達式中空格也是字符 the cost is $4.0 the cost isis $4.0 [root@localhost gawk]#
字符組spa
[root@localhost gawk]# cat data1 test text the cost is $4.0 the cost isis $4.0 is cost $4.0 the is cast $4.0 the is cbst $4.0 [root@localhost gawk]# sed -n '/[ab]st/p' data1 the is cast $4.0 the is cbst $4.0 [root@localhost gawk]#
排除型字符組命令行
反轉字符組,尋找組中沒有的字符,空格也是字符
[root@localhost gawk]# cat data1 test text the cost is $4.0 the cost isis $4.0 is cost $4.0 the is cast $4.0 the is cbst $4.0 [root@localhost gawk]# sed -n '/[^ab]is/p' data1 the cost is $4.0 the cost isis $4.0 the is cast $4.0 the is cbst $4.0 [root@localhost gawk]#
區間
[root@localhost gawk]# echo "28392" | sed -n '/^[0-9][0-9][0-9][0-9][0-9]$/p' 28392 [root@localhost gawk]# echo "a8392" | sed -n '/^[0-9][0-9][0-9][0-9][0-9]$/p' [root@localhost gawk]# echo "448392" | sed -n '/^[0-9][0-9][0-9][0-9][0-9]$/p' [root@localhost gawk]#
[root@localhost gawk]# echo "I'm getting too fat" |sed -n '/[a-ch-m]at/p' [root@localhost gawk]# echo "I'm getting too lat" |sed -n '/[a-ch-m]at/p' I'm getting too lat [root@localhost gawk]#
BRE特殊字符組
BRE特殊字符組 [[:alpha:]] 匹配任意字母字符,無論是大寫仍是小寫 [[:alnum:]] 匹配任意字母數字字符0~9、A~Z或a~z [[:blank:]] 匹配空格或製表符 [[:digit:]] 匹配0~9之間的數字 [[:lower:]] 匹配小寫字母字符a~z [[:print:]] 匹配任意可打印字符 [[:punct:]] 匹配標點符號 [[:space:]] 匹配任意空白字符:空格、製表符、NL、FF、VT和CR [[:upper:]] 匹配任意大寫字母字符A~Z
[root@localhost gawk]# sed -n '/^[[:digit:]]/p' data1 123 test [root@localhost gawk]# cat data1 test text 123 test the cost is $4.0 the cost isis $4.0 is cost $4.0 the is cast $4.0 the is cbst $4.0 [root@localhost gawk]# sed -n '/^[[:digit:]]/p' data1 123 test [root@localhost gawk]#
星號
在字符後面放置星號代表該字符必須在匹配模式的文本中出現0次或屢次。
[root@localhost gawk]# echo "ik" |sed -n '/iee*k/p' #e 出現0次或者屢次 [root@localhost gawk]# echo "ik" |sed -n '/ie*k/p' ik [root@localhost gawk]#
root@localhost gawk]# echo "test txt peoplea." |sed -n '/people.*/p' test txt peoplea. [root@localhost gawk]# echo "test txt peopleadf." |sed -n '/people.*/p' test txt peopleadf. [root@localhost gawk]# echo "test txt people1." |sed -n '/people.*/p' test txt people1. [root@localhost gawk]#
[root@localhost gawk]# echo "ffffsassee" |sed -n '/f[ds]*a/p' #d 或者s 出現 0次或者屢次 ffffsassee
2、擴展正則表達式(ERE)
POSIX ERE模式包括了一些可供Linux應用和工具使用的額外符號。gawk程序可以識別ERE模式,但sed編輯器不能
問號
問號相似於星號,不過有點細微的不一樣。問號代表前面的字符能夠出現0次或1次,但只限於此。它不會匹配屢次出現的字符。
[root@localhost gawk]# echo "bt" |gawk '/be?t/{print $0}' bt [root@localhost gawk]# echo "bet" |gawk '/be?t/{print $0}' bet [root@localhost gawk]# echo "beet" |gawk '/be?t/{print $0}' [root@localhost gawk]#
加號
加號是相似於星號的另外一個模式符號,但跟問號也有不一樣。加號代表前面的字符能夠出現1次或屢次,但必須至少出現1次。若是該字符沒有出現,那麼模式就不會匹配。
[root@localhost gawk]# echo "bt" |gawk '/be+t/{print $0}' [root@localhost gawk]# echo "bet" |gawk '/be+t/{print $0}' bet [root@localhost gawk]# echo "beet" |gawk '/be+t/{print $0}' beet [root@localhost gawk]# echo "beeet" |gawk '/be+t/{print $0}' beeet [root@localhost gawk]#
使用花括號
ERE中的花括號容許你爲可重複的正則表達式指定一個上限。這一般稱爲間隔(interval)。能夠用兩種格式來指定區間,默認狀況下,gawk程序不會識別正則表達式間隔。必須指定gawk程序的--re- interval命令行選項才能識別正則表達式間隔。
m:正則表達式準確出現m次。
m, n:正則表達式至少出現m次,至多n次。
這個特性能夠精確調整字符或字符集在模式中具體出現的次數。
[root@localhost gawk]# echo "bt" | gawk --re-interval '/be{1}t/{print $0}' [root@localhost gawk]# echo "bet" | gawk --re-interval '/be{1}t/{print $0}' bet [root@localhost gawk]# echo "beet" | gawk --re-interval '/be{1}t/{print $0}' [root@localhost gawk]#
[root@localhost gawk]# echo "beet" | gawk --re-interval '/be{1,2}t/{print $0}' #m 至少出現m 次,至多出現n 次 beet [root@localhost gawk]# echo "bt" | gawk --re-interval '/be{1,2}t/{print $0}' [root@localhost gawk]# echo "beeet" | gawk --re-interval '/be{1,2}t/{print $0}' [root@localhost gawk]#
管道符號
管道符號容許你在檢查數據流時,用邏輯OR方式指定正則表達式引擎要用的兩個或多個模式。若是任何一個模式匹配了數據流文本,文本就經過測試。若是沒有模式匹配,則數據流文本匹配失敗
使用管道符號的格式以下:
expr1|expr2|...
[root@localhost gawk]# echo "The cat is asleep" |gawk '/cat|dog/{print $0}' The cat is asleep [root@localhost gawk]# echo "The dog is asleep" |gawk '/cat|dog/{print $0}' The dog is asleep [root@localhost gawk]#
表達式分組
正則表達式模式也能夠用圓括號進行分組。當你將正則表達式模式分組時,該組會被視爲一個標準字符。能夠像對普通字符同樣給該組使用特殊字符。
[root@localhost gawk]# echo "testqaz" |gawk '/test(qaz)?/{print $0}' testqaz [root@localhost gawk]# echo "testqad" |gawk '/test(qaz)?/{print $0}' testqad [root@localhost gawk]# echo "testqad" |gawk '/test(qaz)+/{print $0}' [root@localhost gawk]#
[root@localhost gawk]# echo "tab" |gawk '/(r|q)a(c|b)/{print $0}' [root@localhost gawk]# echo "tab" |gawk '/(t|q)a(c|b)/{print $0}' tab [root@localhost gawk]#
正則表達式實戰
1.目錄文件計數
#遍歷環境變量目錄並統計文件數量
#經過兩個循環來處理數據
[root@localhost gawk]# cat countfiles.sh #!/bin/bash #count number of files in you path mypath=$(echo $PATH |sed 's/:/ /g') #對數據進行處理,將分隔符: 替換爲空格,for 循環默認空格爲分隔符 count=0 #設置初始數值0 for directory in $mypath;do #for 循環遍歷目錄 check=$(ls $directory) #ls 列出目錄文件,並賦值給變量 check for item in $check;do #for 循環遍歷文件 count=$[ $count + 1 ] #累加count done echo "$directory file count - $count" #輸出目錄文件數量 count=0 #統計計0,進入下一個目錄循環操做 done [root@localhost gawk]# ./countfiles.sh /usr/local/sbin file count - 0 /usr/local/bin file count - 2 /usr/sbin file count - 472 /usr/bin file count - 925 ls: 沒法訪問/root/bin: 沒有那個文件或目錄 /root/bin file count - 0 [root@localhost gawk]#
驗證電話號碼
[root@localhost gawk]# cat testphone #!/bin/bash #gawk --re-interval '/^\(?[2-9][0-9]{2}\)?(| |-|\.)[0-9]{3}( |-|\.)[0-9]{4}/{print $0}' gawk --re-interval '/^\(?[5-7][0-9]{2}\)?(| |-|\.)[0-9]{3}(|-|\.)[0-9]{5}/{print $0}' [root@localhost gawk]#
驗證郵箱
[root@localhost gawk]# cat testmail #在這個正則表達式中匹配任意大小寫字母,數字,中橫線,下劃線,點號,出現至少一次或者屢次 #!/bin/bash gawk --re-interval '/^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$/{print $0}' [root@localhost gawk]# echo "12_3+@com.cn" |./testmail 12_3+@com.cn [root@localhost gawk]# echo "123@com.cn." |./testmail [root@localhost gawk]# echo "123+@com.cn" |./testmail 123+@com.cn
[root@localhost gawk]# echo "123+.qaz@com.cn" |./testmail 123+.qaz@com.cn [root@localhost gawk]#