正則表達式:Regual Expression,REGEXP
由一類特殊字符及文本字符所編寫的模式,其中有些字符不表示其字面意義,而是用於表示控制或通配的功能。
分兩類:
基本正則表達式:BRE
擴展正則表達式:ERE
grep:Global search REgular expression and print out the line
作用:文本搜索工具,根據用戶指定的“模式(過濾條件)”對目標文本逐行進行匹配檢查,打印匹配到的行。
模式:由正則表達式的元字符及文本符所編寫出的過濾條件。
正則表達式引擎:
grep [options] pattern [file]
grep [options] -e pattern [-f file] [file...]
-i :忽略字符大小寫
-o :僅顯示匹配到的字符串本身
-v :顯示不能夠被匹配到的行
-E :支持使用擴展的正則表達式
-w :整行匹配某個單詞 (一行就一個單詞可重複)
-q :靜默模式,不輸出任何消息
-r :遞歸查找每個目錄
-c :統計行數
-e :指定字符串作爲查找文件內容的範本樣式
-A # :after 後#行
-B # :before前#行
-C # :context前後各#行
-n :匹配到的行加行號
基本正則表達式元字符:
字符匹配:
. :任意單個字符
[] :匹配指定範圍的任意單個字符
[^] :匹配指定範圍外的任意單個字符
匹配次數:
用在要指定其出現的次數的字符的後面。用於限制其前面字符出現的次數,默認工作於貪婪模式。
* :匹配前面的字符任意次:0,1,多次
.* :匹配任意長度的任意字符
\? :匹配其前面的字符0次或1次,即前面的字符是可有可無的
\+ :匹配其前面字符1次或多次
\{m\}:匹配前面的字符m次
\{m,n\}:匹配其前面的字符至少m次,至多n次
\{0,n\}:至多n次 小於等於n
\{m,\}:至少m次 大於等於m
位置錨定:
^ :行首錨定,用於模式最左側
$ :行尾錨定
^...$:匹配整行
^$ :空白行 ^[[:space:]]$ 包含空白字符的行
\<或\b:詞首錨定
\>或\b:詞尾錨定
\<PATTERN\>:錨定完整單詞
分組及引用:
\(\) 轉義符加括號,將多個字符捆綁在一起,當做整體處理
分組括號中的模式匹配到的內容會被正則表達式引擎自動記錄於內部的變量中,這些變量爲:
\1:第一組括號 (從左面數的第一個括號)
\2:第二組括號
例:
grep "\(l..e\).*\1" love.txt
egrep:
支持擴展的正則表達式實現類似於grep文本過濾功能,-G支持一般正則表達式
egrep [OPTIONS] PATTERN [FILE...]
擴展正則表達式的元字符:
. :任意單個字符
[] :匹配指定範圍的任意單個字符
[^] :匹配指定範圍外的任意單個字符
匹配次數:
用在要指定其出現的次數的字符的後面。用於限制其前面字符出現的次數,默認工作於貪婪模式。
* :匹配前面的字符任意次:0,1,多次
? :匹配其前面的字符0次或1次,即前面的字符是可有可無的
+ :匹配其前面字符1次或多次
{m}:匹配前面的字符m次
{m,n}:匹配其前面的字符至少m次,至多n次
{0,n}:至多n次 小於等於n
{m,}:至少m次 大於等於m
位置錨定:
^ :行首錨定,用於模式最左側
$ :行尾錨定
\<或\b:詞首錨定
\>或\b:詞尾錨定
分組及引用,同grep
或者:
a|b cat|C 表示整個左側或者整個右側
練習:
找出/proc/meminfo文件中,所有以大寫或小寫s開頭的行,至少三種方式:
grep -i "^s" /proc/meminfo
grep "^[sS]" /proc/meminfo
grep -E "^(s|S)" /proc/meminfo
顯示當前系統上roo、centos或者user用戶的相關信息
grep -E "^(root/centos/user)\>" /etc/passwd
找出/etc/rc.d/init.d/functions文件中行首爲某單詞(包括下劃線)後面跟一個小括號的行
grep -E -o "[_[:alnum:]]+\(\)" /etc/rc.d/init.d/functions
使用echo命令輸出一絕對路徑,使用egrep取出基名
echo /etc/sysconfig/ | grep -E -o "[^/]+/?$"
找出ifconfig命令結果中1-255之間的數值
ifconfig | grep -E -o "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"
找出ifconfig命令結果中所有IPv4地址
ifconfig | grep -E -o "(\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>\.)(\<([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>\.){2}\<([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>"
找出/etc/passwd文件中用戶名同shell名的行
grep -E "^([^:]+\>).*\1$" /etc/passwd
找出ifconfig eth0 的ip地址
ifconfig eth0 | grep "inet addr" | cut -d: -f 2|cut -d " " -f 1