正則表達式是通過一些特殊符號的排列,用以查找、替換、刪除一行或者多行文字字符串。對於程序來說,更加重要的用途是驗證字段的合法性。本文介紹Linux和常用程序的正則表達式的使用。
一、Linux中grep工具的介紹和簡單使用
grep [option] ‘正則’ filename
-i :忽略要匹配內容的大小寫
-n:輸出匹配到行的行號
-o:僅顯示匹配的字串,而非字串所在的行
-E:支持使用擴展正則表達式
如:匹配/etc/test.txt中含有test的字符串
grep test /etc/test/txt
如:匹配/etc/passwd下含有root這個字符串信息的用戶信息,並顯示匹配到的信息所在的行
[root@MyTesting /]# grep -n root /etc/passwd 1:root:x:0:0:root:/root:/bin/bash 11:operator:x:11:0:operator:/root:/sbin/nologin
二、基本的正則表達式匹配
(1)特殊符號表示正則,如下常用匹配內容。
Linux中所支持的匹配
[[:digit:]] 代表數字0-9
[[:lower:]] 代表小寫字母a-z
[[:upper:]] 代表大寫字母A-Z
[[:space:]] 代表空格,包括tab
[[:punct:]] 代表標點符號
[[:alpha:]] 代表任何英文字母,a-z和A-Z
[[:alnum:]] 代表任何英文字母和數字
常用編程語言所支持的匹配
\d 代表數字0-9
\D 代表非數字0-9
\w 代表任何英文字母和數字,包括下劃線
\W 代表非任何英文字母和數字,包括下劃線
\s 代表任何空白字符
\S 代表非空白字符
\b 代表單詞的邊界
\B 代表非單詞的邊界
\n 代表一個換行符
\r 代表一個回車符
例如:
把/etc/passwd下的含有大寫字母的行列出來
grep --color '[[:upper:]]' /etc/passwd
(2)特俗符號匹配
1、字符匹配
[]:表示範圍內的匹配,如匹配0-9範圍,則可表示爲[0-9]
.:表示任意單個字符
2、次數匹配
*:表示任意長度次數的匹配,.*則表示任意長度的任意字符,可以匹配任何內容
如:
grep --color 'r.*t' /etc/passwd
\?:匹配0次或者1次
如:
grep --color 't\?' /etc/passwd
有沒有匹配到t的行都顯示出來
\+:匹配一次以上
如:
grep --color 't\+' /etc/passwd
只有匹配到有t的行纔會被顯示出來
{m}:精確匹配m次,如{2},精確匹配2次
{m,n}:至少匹配m次,至多匹配n次,如{1-10},出現1-10次都會被匹配到
{m,}:匹配m次以上,如{3,},出現3次以上纔會被匹配到
{0,n}:至多匹配n次,如{0,3},出現3次以下的纔會被匹配到
如:匹配 /etc/passwd中,出現4位數字以上的行
grep --color '[[:digit:]]\{4,\}' /etc/passwd
(3)位置錨定
^:匹配首部
$:匹配尾部
\<:匹配單詞開始,可以用\b代替
\>:匹配單詞結束,可以用\b代替
^$:匹配空白行
如:匹配 /etc/passwd中,首部出現root的行
grep --color '^root' /etc/passwd
(4)分組
():表示分組
如:匹配 /etc/passwd中,用戶爲root或者bin的行
grep --color '^\(root\|bin\)' /etc/passwd
(5)後項引用
後項引用是指引用分組裏面匹配到的內容。
如第一個括號分組匹配到的內容,用\1表示
如:匹配/etc/passwd中開頭爲root,之後又出現root的行。
grep -E --color '^(root).*\1' /etc/passwd
三、擴展正則表達式
擴展正則表達式跟基本表達式差不多,基本匹配語法爲:
grep -E ‘正則’ filename 或者
egrep ‘正則’ filename
所支持元字符如下:
.:表示任意字符
[]:表示符合中括號內的範圍字符
[^]:表示匹配非中括號範圍內的字符
*:表示匹配任意次
?:表示匹配0次或1次
+:表示至少匹配1次
{m}:表示精確匹配m次
{m,n}:表示至少匹配m次,至多匹配n次
{m,}:表示匹配m次或以上
{0,n}:表示最多匹配n次
^:表示開頭匹配
$:表示結尾匹配
\<,\b:表示匹配開頭單詞
\>,\b:表示匹配結尾單詞
^$,^[[:space:]]*$:表示匹配空白字符
():表示匹配分組,匹配括號內的整個字符串內容
\1,\2,\3:表示引用分組分別爲第1,2,3個的內容
四、常用正則表達式匹配
(1)找出/etc/rc.d/init.d/functions文件中某單詞後跟一組小括號“()”行
grep -o -E "\<[[:alnum:]]+\>\(\)" /etc/rc.d/init.d/functions
(2)使用echo命令輸出一個路徑,而後使用grep取出其基名。如/etc/sysconfig,取基名則爲sysconfig
echo '/etc/sysconfig/' | grep -o -E "[[:alnum:]]+/?$" | cut -d/ -f1
(3)找出ifconfig命令結果中的1-255之間的數字
ifconfig | grep -o -E "[[:digit:]]|[[:digit:]][[:digit:]]|2[0-4][[:digit:]]|25[[:digit:]]
(4)寫一個模式,能匹配合理的ipv4地址
ifconfig | grep -o -E "([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-3][0-9])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])"