今天我將正則表達式的學習心得寫出來和大家一起分享,請大家多多指點
要學習一件事情之前,必須要知道它是什麼?有什麼作用?這些作用能爲我們帶來什麼?知道了這三點之後,再去學習它
正則表達式 Regular EXPression,簡寫爲REGEXP
正則表達式:是用來描述某些複雜規則的工具,記錄文本規則的代碼;由一些不表示自身意思的源代碼組成;可以使得管理員的工作量大大減小,速度更快,效率更高;使得我們的計算機變得更智能;而正則表達式的實現一般藉助三種文本處理工具:grep,sed,awk,今天我們以grep爲例學習正則表達式的使用:
基本正則表達是的元字符有:
. :匹配任意單個字符
[] :匹配中括號範圍以內的字符
[^] :只匹配中括號範圍以外的字符
^ :匹配以其後面字符爲開頭的行
$ :匹配以其前面字符爲結尾的行
^$ :匹配空白行
\b*\b :匹配某個確定單詞,也可以表示匹配以*開頭或結尾的單詞(此時*表示任 意字符)
* :匹配前面字符任意次
\{m,n\} :匹配起前面字符最少m次,最多n次
+ :重複前面字符至少一次,多則不限
\(\) :匹配小括號內的內容,且支持後向引用(引用時如果只有一個分組,則只用在後邊添寫\n即可,如果有多個分組,則需要表明)
\ :逃字符,顯示元字符本身的意思;
\. :此時只表示字符“.”而不是任意單個字符
使用正則表達式查找文件時的命令格式爲:
grep [optinos] PATTERN filename 命令+[參數]+模式+文件
實例:# grep “r..t” /etc/passwd
表示匹配文件passwd中以r開頭中間是兩個任意字符,以t結尾的字符串
# grep “[ 0-9 ]” /etc/passwd。。。。。。。。。。。。中括號和範圍之間可有空格,也可沒有
匹配文件passwd中0-9中的任意字符
# grep “[^0-9]” /etc/passwd。。。。。。。。。。。。此時中括號和^及範圍之間沒有空格
匹配文件passwd中除了0-9以外的任意字符
# grep “^root” /etc/passwd
匹配文件中以字符root開頭的行(此時顯示時只突出顯示匹配行中開頭的字符)
# grep “bash$” /etc/passwd
匹配文件中以字符bash結尾的行(顯示時只突出顯示匹配行中結尾的字符)
# grep “^$” /etc/inittab
匹配文件inittab中的空白行
# grep “\buser1\b” /etc/passwd
只匹配文件passwd中的單詞user1(顯示時只突出顯示匹配到的行中匹配單詞)
# grep “b.*h” /etc/passwd
匹配文件passwd中以b開頭後邊跟任意個字符,並且以h結尾的字符串
# grep “ro\{1,2\}t” /etc/passwd
匹配文件passwd中任何以r開頭,中間有一個或者兩個o,以t結尾的字符
(此時\前面的字符爲o,而大括號內的數字爲1,2,所以只重複前面字符o 至少一次,最多兩次。次數匹配還可以寫爲\{1,\},重複前面字符最少一次, 多則不限;\{0,9\}重複前面字符至少零次,最多九次,此時前面必須寫零)
# grep “ro\+\t” /etc/passwd
匹配文件中以含有r和t,中間至少一個o的字符串
# grep “\(user\).*\1” /etc/passwd
匹配文件passwd文件中含有user後面跟任意字符並且以user結尾的行
\n表示引用前面分組字符n次
# grep “\/bin\/bash” /etc/passwd
匹配文件passwd中含有/bin/bash的行,此時/只表示路徑
正則表達式支持的字符集:
[:space:] 空白字符的集合
[:digit:] 所有數字的集合
[:lower:] 所有小寫字母的集合
[:upper:] 所有大寫字母的集合
[:alpha:] 所有大小寫字母的集合
[:alnum:] 所有數字的集合
[:punct:] 所有標點符號的集合
實例:# gerp “[[:space:]]*[[:lower:]]*[[:digit:]]” /etc/inittab
匹配文件inittab中所有含有任意個空白字符,之後跟任意個小寫字母,在跟數字的字符串
我們在使用grep進行文件查找匹配時,往往加入一些參數,使得我們的查找更加精確,這些參數有:
-i 查找字符時不區分大小寫
-v 顯示不包括匹配模式的所有內容
-o 只顯示搜索到的內容
--color 將搜索到的內容以高亮顏色顯示(默認爲紅色)
-n 顯示搜索到的內容時顯示行號
-A n 顯示搜索到的內容時,順便顯示這一行下邊n行,每一組之間以“--”隔開
-B n 顯示搜索到的內容時,顯示這一行上邊n行
-C n 顯示搜索到的內容時,顯示這一行上邊和下邊各n行
-E 使用擴展正則表達式,egrep==grep -E
實例:
# grep -iv “bash” /etc/passwd
查找文件passwd中含有bash字符串的行,不管大小寫,並且只顯示沒有匹配到的行
# grep -io “bash” /etc/passwd
查找文件passwd中含有bash的行,不管大小寫,並且只將匹配到的行顯示出來
# grep --color “^root” /etc/passwd
查找文件passwd中所有以root開頭的行,並將匹配到的字符串以高亮顏色顯示
# grep --color -ion “user” /etc/paswd
查找文件passwd中所有含有user的行,不管大小寫,只以高亮顏色顯示匹配到的字符 串,並且顯示這些字符串所在的行的行號
# grep -iA3 “^root” /etc/passwd
查找文件passwd中所有以root開頭的行,不管大小寫,並將這一行以下三行顯示出來
# grep -iB3 “bash$” /etc/passwd
查找文件passwd中所有以bash結尾的行,不管大小寫,並將這些行的上邊三行顯示出來,每一個被匹配到的行顯示一段,中間以“--”隔開
# grep -ic2 “halt$” /etc/passwd
查找文件passwd中以halt結尾的行,並將這一行上邊兩行和下邊兩行都顯示出來
擴展正則表達式:當我們要查找某一特定字符串的時候我們使用基本正則表達式即可完成任務,但是我們有時候並不確定索要查找的字符串是什麼樣的,如要搜索bash或halt或sync,此時三個字符串之間的關係是或,而不是和,這個時候我們就要使用擴展正則表達式!
擴展正則表達式的元字符和基本正則表達式相同,只是多了幾個
? 匹配其前面字符一次或者零次,表示前面字符可有可無
| 匹配字符串一或者字符串二
() 將括號內的內容視爲一個整體
實例:
# egrep “ro?t” /etc/passwd
匹配文件passwd中含有字符串root或者rot的行
# egrep “root|bin” /etc/passwd
匹配文件passwd中含有字符串root或者bin的行
# egrep “r(oo|ou)t” /etc/passwd
匹配文件passwd中含有字符串root或者rout的行
文字查找還有fgrep,快速文本查找,但不支持正則表達式,如果在查找文本時不打算使用元字符,建議使用fgrep進行查找!