正則表達式就是處理字符串的方法,它通過一些特殊符號的輔助,可以讓用戶輕易達到查找,刪除,替換某特定字符串的處理程序.
一.grep
作用:文本搜索工具,根據用戶指定模式(過濾條件).對目標文本逐行進行匹配檢查;打印匹配到行
grep [option] [--color=auto] '查找字符串' filename
選項:
-c: 計算找到'查找字符串'的次數
-i :忽略大小寫的不同,不區分大小寫
-o :僅顯示匹配到的字符串
-n: 順便輸出行號
-v :反向選擇,即顯示出沒有'查找字符串'內容的那一行
-q:靜默模式,既不輸出結果
-E:支持使用擴展的正則表達式
--color=auto 可以將關鍵字部分加上顏色顯示
-A#:after,後#行
-B#:before 前#行
-C#:context,前後各#行
基本正則表達式的元字符:
字符匹配:
.:匹配任意單個字符
[]:匹配指定範圍內的任意單個字符
[^]:匹配指定範圍外的任意單個字符
[:digit:]任意數字0-9之間
[:lower:]任意小寫字母
[:upper:]任意大寫字母
[:alpha:]任意大小寫字母
[:alnum:]任意數字或字母
[:space:]空格
[:punct:]標點符號
匹配次數:用在要指定其出現的次數的字符後面,用於限制其前面字符出現的次數
*:匹配前面的字符任意次:0,1,多次:
.*:匹配0個或多個任意字符
\?:匹配前面的字符0次或 一次;即前面的字符是可有可無的
\+:匹配前面的字符1次或多次;即前面的字符要出現至少一次
\{m\}:匹配其前面的字符m次
\{m,n\}:匹配其前面的字符至少n次,至多n次
\{0,n\} :至多n次
\{m,\} :至少m次
位置錨定:
^:行首錨定:用於模式的最左側
$:行尾錨定;用於模式的最右側
^PATTERNS:用於PATTERNS來匹配整行
^$:空白行
^[[:space:]]*$:空行或包含空白字符的行
單詞:非特殊字符組成的連續字符(字符串)都稱爲單詞
\<或\b:詞首錨定,用於單詞模式的左側:
\>或\b:詞尾錨定,用於單詞模式的右:
\<PATTERN\>:匹配完整單詞
分組及引用
\(\):將一個或多個字符捆綁在一起,當做一個整體進行處理
\(xy\)*ab
note:分組括號中的模式分配到的內容會被正則表達式引擎自動記錄在內部的變量中,這些變量爲:
\1:模式從左側起,第一個左括號以及與之匹配的右括號之間的模式所匹配到的字符
\2:模式從左側起,第二個左括號以及與之匹配的右括號之間的模式所匹配的字符
\3:......
後向引用:引用前面的分組括號中的模式所匹配的字符;
實例:
1.查找帶有ch的字符串
或
(2)在文件test.txt中取得無論大小寫的"the"
[root@localhost ~]# grep -in 'the' test.txt -i:忽略大小寫;-n顯示行數 8:I can't finish the test. 9:Oh! The soup taste good. 12:the symbol '*' is represented as start. 14:The gd software is a library for drafting programs. 15:You are the best is mean you are the no. 1. 16:The world <Happy> is the same with "glad". 18:google is the best tools for search keyword.
(3)在test.txt中查找帶有test或taste兩個單詞.
[root@localhost ~]# grep -n t[ae]st test.txt
test和taste都帶有t[]st []裏面無論有幾個字符,都代表任意一個字符
8:I can't finish the test.
9:Oh! The soup taste good..
(4)查找test.txt中oo前面沒有小寫字符的字符段
[root@localhost ~]# grep -n '[^a-z]oo'test.txt 3:Football game is not use feet only.
練習:
(1)找出etc/passwd文件中的兩位或三位數
[root@localhost ~]# grep -n "\<[0-9]\{2,3\}\>" /etc/passwd
(2)找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一個空白字符開頭,而且後面非空白字符的行
[root@localhost ~]# grep -n "^[[:space:]]\+[^[:space:]]" /etc/rc.sysinit
(3)找出"netstat -tan"命令的結果中以"LISTEN"後跟0.1或多個空字符結尾的行
[root@localhost ~]# netstat -tan |grep -n "LISTEN[[:space:]]*$"
二.egrep
支持擴展的正則表達式實現雷士與grep文本過濾功能:grep -E
egrep [OPTIONS] PATTERN[files..]
選項:
-i,-o,-v,-q,-A,-B,-C
-G支持基本正則表達式
擴展正則表達式的元字符:
字符匹配:
.:任意單個字符
[]:指定範圍的單個字符
[^]:指定範圍外的任意單個字符
次數匹配:
*:任意次,0,1或多次
?:0次或一次,其前的字符是可有可無的
+:其前字符至少1次
{m}其前的字符m次
{m,n}:至少m次,至多n次
...
位置錨定
^:行首錨定
$:行尾錨定
\<:詞首錨定
\>:詞尾錨定
分組及引用
()分組:括號內的模式[匹配到的字符會被記錄與正則表達式引擎的內部變量中:
向後引用:\1,\2,...
或
a|b;C或cat
(c|C)at,cat或Cat
實例練習
(1)找出/proc/meminfo 文件中,所有以大小寫s開頭的行,至少寫三種
[root@localhost ~]# grep -in "^s" /proc/meminfo [root@localhost ~]# grep "^[Ss]" /proc/meminfo [root@localhost ~]# egrep "^[S|s]" /proc/meminfo
(2).顯示當前系統上root,centos或user1用戶的相關信息
[root@localhost ~]# egrep "^(root|centos|user1)\>" /etc/passwd
(3)找出/etc/rc.d/init.d/functions文件中某單詞後面跟一個小括號的行
[root@localhost ~]# egrep -no "[[:alnum:]]+\(\)" /etc/rc.d/init.d/functions
(4)使用echo命令輸出一絕對路徑,使用egrep取出基名
[root@localhost ~]# echo /etc/sysconfig/ |grep -E -o "[^/]+/?$" sysconfig/
fgrep :不支持正則表達式元字符
當無需用到元字符去編寫模式時,使用fgrep會更好