grep和正則表達式
摘要
1、描述grep文本搜索工具。
2、初識正則表達式.
3、描述擴展正則表達式egrep。
一、Linux上的grep文本搜索工具
Linux文本處理工具:
grep:文本過濾工具(模式:patten)
sed:文本編輯器,流編輯器
awk:Linux上的實現爲gawk,文本報告生成器(格式化文本)
grep:
作用:文本搜索工具,根據用戶指定的“模式(過濾條件)”對目標文本逐行進行匹配檢查,打印匹配到的行
模式:由正則表達式的元字符所編寫的過濾條件
grep [OPTIONS] PATTERN [FILE]......
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
OPTIONS:
--color=auto: 對匹配到的文本進行着色高亮顯示
-i 在文本過濾時忽略字符大小寫
-o 僅顯示匹配到的字符串的本身
-v 反向匹配。顯示不能被模式匹配到的行
-E 支持使用擴展的正則表達式元字符
-q,-quiet,-silent 靜默模式,即不輸出任何內容和信息
-A #(數字) 顯示匹配後#行
-B # 顯示匹配前#行
-C # 顯示匹配上下#行
二、基本正則表達式
1)字符匹配
*:匹配任意長度的任意字符
? :匹配任意單個字符
pa? ??pa p?a p?a?
[ ]: 匹配指定範圍內的任意單個字符
有幾種特殊格式:
[a-z] [A-Z] [0-9] [a-z0-9] [abcxyz] pa[0-9][a-z] pa2[0-9][0-9]
[[:upper:]] 只匹配大寫字母
[[:lower:]] 只匹配小寫字母
[[:alpha:]] 只匹配所有字母
[[:digit:]] 只匹配所有數字
[[:alnum:]] 只匹配所有字母和數字
[[:space:]] 所有空白字符 touch p \空格 a
[[:punct:]] 匹配所有符號
[^] :匹配指定範圍外的單個字符(非!!)
[^[:upper:]]
[^0-9]
2)字符匹配
. 匹配任意單個字符
[] 匹配指定範圍內的任意單個字符
[^] 匹配指定範圍外的任意單個字符
匹配次數 用在要指定其出現的次數的字符的後面,用於顯示其前面字符出現的次數
* 匹配前面的字符任意次數; 0次 1次 N次
eg: grep "x*y"
abxy aby xxxxy yab
.* 匹配任意長度的任意字符
\? 匹配其前面的字符0次或者1次,即其前面的字符是可有可無的
\+ 匹配其前面的字符1次或者多次,即前面的字符至少出現一次
\{m\} 精確匹配其前面次數m次,m替換爲數字
\{m,n\} 匹配前面的字符至少m次,最多n次
\{0,n\} 至多n次,至少0次
\{m,\} 至少m次
3)位置錨定
^ 行首錨定 用於寫在模式的最左側 ^root
$ 行尾錨定 用於模式的最右側 root$
^PATHERN$ 用於PATHERN來匹配整行
^$ 空白行,不包括任意字符
^[[:space:]]*$ 空行或包括空白字符的行
單詞:非特殊字符組成的連續字符(字符串)
\<或者 \b 詞首錨定,用於單詞模式的左側
\>或者\b 詞尾錨定,用於單詞模式的右側
\<PATHERN>\ 匹配完整單詞
練習:
1、顯示/etc/passwd文件中不以/bin/bash結尾的行
grep -v "/bin/bash$" etc/passwd
2、找出/etcpasswd文件中兩位數或三位數
grep “\<[0-9]\[2,3\]>\” /etc/passwd
3、找出/etc/rc.d/rc.susinit文件中,以至少一個空白字符開頭,且後面非空白字符的行
grep "^[[:space:]]\+[^[:space:]]" /etc/rc.d/rc.susinit
4、找出“netstat -tan”命令的結果中以‘LISTEN’後跟0.1或多個空白字符結尾的行
netstat -tan | grep "LISTEN[[:space:]]*$"
4)分組和引用
1、分組: 將一個或者多個字符捆綁在一次,當做一個整理處理 ,其符號是: \(\)
eg:\(xy)\* ab 把xy當做一個整體的字符
Note 分組括號中的模式匹配到的內容會被正則表達式引擎自動記錄在內部的變量中,這些變量爲:
\1 模式從左側起,第一個左括號以及與之匹配的右括號之間的模式所匹配到的字符
\2 模式從左側起,第二個左括號以及與之匹配的右括號之間的模式所匹配到的字符
\3 模式從左側起,第三個左括號以及與之匹配的右括號之間的模式所匹配到的字符
。。。。。
2、後向引用: 引用前面的分組括號中的模式所匹配到的字符
三、擴展正則表達式egrep:
支持擴展的正則表達式實現類似於grep文本過濾功能: grep -E
語法:
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
命令選項:
-i 在文本過濾時忽略字符大小寫
-o 僅顯示匹配到的字符串的本身
-v 反向匹配。顯示不能被模式匹配到的行
-E 支持使用擴展的正則表達式元字符
-q,-quiet,-silent 靜默模式,即不輸出任何內容和信息
-A #(數字) 顯示匹配後#行
-B # 顯示匹配前#行
-C # 顯示匹配上下#行
-G 支持基本正則表達式
1)擴展正則表達式的元字符:
字符匹配
. 任意單個字符
[ ] 指定範圍內的任意單子字符
[^ ]指定範圍外的任意單個字符
次數匹配
* 任意次
? 0次或1次,其前的字符是可有可無的
+ 其前字符至少1次
{m}:其前的字符m次
{m,n} 至少m次,至多n次 {0,n} {m,}
位置錨定
^ 行首錨定
$ 行尾錨定
\<,\b 詞首錨定
\>,\b 詞尾錨定
分組及引用
0 :分組 ,括號內的模式匹配到的字符會被記錄於正則表達式引擎的內部變量中
後向引用: \1 \2 .........
或者
a|b 表示a或者b
C|cat 表示C或者cat
(c|C)at 表示cat或者Cat
練習:
1、找出/proc/meminfo文件中,所有以大寫或小寫S開頭的行;至少有三種實現方式;
~]# grep -i "^s" /proc/meminfo
~]# grep "^[sS]" /proc/meminfo
~]# grep -E "^(s|S)" /proc/meminfo
2、顯示肖前系統上root、centos或user1用戶的相關信息;
~]# grep -E "^(root|centos|user1)\>" /etc/passwd
3、找出/etc/rc.d/init.d/functions文件中某單詞後面跟一個小括號的行;
~]# grep -E -o "[_[:alnum:]]+\(\)" /etc/rc.d/init.d/functions
4、使用echo命令輸出一絕對路徑,使用egrep取出基名;
~]# echo /etc/sysconfig/ | grep -E -o "[^/]+/?$"
進一步:取出其路徑名;類似於對其執行dirname命令的結
5、找出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])\> “
6、課外作業:找出ifconfig命令結果中的IP地址;
7、添加用戶bash, testbash, basher以及nologin(其shell爲/sbin/nologin);而後找出/etc/passwd文件中用戶名同shell名的行;
~]# grep -E "^([^:]+\>).*\1$" /etc/passwd
2)fgrep:不支持正則表達式元字符
當不需要用到元字符去編寫模式時,使用fgrep更好
3)正則表達式: Regual Expression REGEXP
定義:由一類特殊字符及文本字符所編寫的格式,有些字符不表示其字面意義,而是用於表示控制或者通配的功能。
分爲兩類:
1)基本正則表達式: BRE
2)擴展正則表達式: ERE
元字符: \(hello[[:space:]]\+\)+