一.匹配字符
. 匹配任意單個字符
[ ] 匹配指定范圍內的任意字符
[^] 匹配飛指定范圍內的任意字符
[:alpha:] 字母字符
[:lower:] 小寫字母字符
[:upper:] 大寫字母字符
[:digit:] 數字
[:alnum:] 字母數字字符
[:space:] 空白字符(禁止打印),如回車符、換行符、豎直制表符和換頁符
[:punct:] 標點字符
[:cntrl:] 控制字符(禁止打印)
[:print:] 可打印字符
使用時一般使用兩個中括號,具體會在下面的例子中使用。
二.匹配次數
* 匹配前面的字符任一次
.* 匹配任意長度的任意字符(注意貪婪模式,比如 grep “r.*t” /etc/passwd )
x\{m,n\} 指定前面的字符至少出現m次,至多出現N次。
x\{m,\} 指定前面的字符至少出現m次
x\{0,n\} 指定前面的字符至多出現N次
x\{m\} 精確匹配m次
? 匹配其前面的字符0或1次
三.錨定符
1.^ 錨定行首 grep "^r..t" /etc/passwd
2.$ 錨定行尾 grep "h$" /etc/passwd
3.^$ 錨定空白行 grep "^$" /etc/passwd
4.\< (\b) 錨定詞首 grep "\<r..t" /etc/passwd
5.\> (\b) 錨定詞首 grep "r..t\>" /etc/passwd
示例(容易混淆):
至少包含一個空白字符 grep "[[:space:]]\{1,\}" /etc/passwd
至少包含一個非空白字符 grep "[^[:space:]]\{1,\}" /etc/passwd
沒有一個空白字符 grep -v "[^[:space:]]\{1,\}" /etc/passwd
6.\(\)對字符分組 grep "\(l..e\).*\1r"
示例:
grep --color "l\([13]\):\1:.*:\1" /etc/inittab
四.選項
-v 對結果取反
-i 忽略字母大小寫
-o 僅顯示匹配到的字符串(行的其他內容不顯示)
-E 支持擴展的正則表達式
-A n 顯示匹配到的行下面n行
-B n 顯示匹配到的行上面n行
-C n 顯示匹配到的行上下面各顯示n行
練習:
1.查找系統中user1用戶的相關信息。(提前建好user11,myuser1)(易錯)
grep "user1" /etc/passwd 所有包含user1的行
grep "\<user1\>" /etc/passwd 表面可以,但是添加以下用戶,就不可以了
useradd -c "user1's uncle" /etc/passwd -c 是注釋
grep "^\<user1\>" /etc/passwd 成功匹配
2.查找系統中以user開頭後面跟了數字的用戶的相關信息。
grep "^user[0-9]\{1,\}\>" /etc/passwd
3.分析/etc/inittab 文件如下兩行文本的特征,編寫可以精確查到的類似兩行的模式,
要求每行的數字必須相同。
l1:1:wait:/etc/rc.d/rc 1
l3:3:wait:/etc/rc.d/rc 3
grep "l\([13]\):\1:.*:.* \1" inittab
擴展:匹配所有上述特征:grep "l\([0-9]\):\1:.*:.* \1" inittab
如果超過10,需要添加最小匹配:grep "l\([0-9]\{1,\}\):\1:.*:.* \1" inittab
4.顯示/proc/meminfo文件中以不區分大小寫的s開頭的行
grep "^[sS]" /proc/meminfo
5.顯示/etc/passwd中以nologin結尾的行
grep "nologin$" /etc/passwd
6.顯示/etc/inittab中以#開頭,且後面跟一個或者多個空白字符,而後又跟了任意非空白字符的行
grep "^#[[:space:]]\{1,\}[^[:space:]]" /etc/inittab
7.顯示/etc/inittab中包含了兩個冒號中間一個數字的行
grep ":[0-9]:" /etc/inittab
8.顯示/boot/grub/grub.conf 文件中以一個或者多個空白字符的行
grep ":[0-9]:" /etc/inittab
9.顯示/etc/inittab文件中以一個數字開頭並以一個開頭數字相同的數字結尾的行。
grep "^\([0-9]\).*\1$" /etc/inittab
10.顯示/etc/inittab文件中非空白的行
grep -v "^$" /etc/inittab
11.取出當前網絡接口的相關IP地址(不包含127.0.0.1)
ifconfig |grep "inet addr" |grep -v "127.0.0.1"| cut -d: -f2|cut -d" " -f1
ifconfig |grep -A 1 "eth" |grep -o "addr:[0-9.]\{1,\}"|cut -d: -f2
五.擴展正則表達式
與正則表達式不同之處:
\(\)替換為 ()
\{\}替換為 {}
+ 次數匹配,匹配其前的額字符一次或者多次
| 或者
示例:
匹配ifconfig結果中出現數字為1-255之間的整數
ifconfig|grep --color -E "\<([1-9]|[1-9][0-9]|1[1-9][0-9]|2[0-5][0-5])\>"
grep使用簡明及正則表達式 http://www.linuxidc.com/Linux/2013-08/88534.htm
Linux下Shell編程——grep命令的基本運用 http://www.linuxidc.com/Linux/2013-06/85525.htm
Linux下Shell編程——正則表達式基礎與擴展 http://www.linuxidc.com/Linux/2013-06/85523.htm