regexp:元字元
basic regexp:基本正規表達式
extended regexp:擴充正規表達式
grep: Global Research Regular Expression and Printing
grep
egrep
fgrep
使用方法:grep [option] PATTERN file1……
basic regexp:基本正規表達式的元字元
.比對任意單個字元
grep 'r..t' /etc/passwd
*比對其前面的字元任意次 包括0次
grep "r[a-z]*t" /etcpasswd比對 以r開頭t結尾 中間包含a-z任意次數的
grep 'ab*c' (開頭必須是a 内容理由有c,b可以出現一次多次,或不出現,)
.*任意長度的任意字元
grep 'r.*t' /etc/passwd 貪婪模式 能比對多長就比對多長 直到最後一個
[]指定範圍内的任意單個字元;隻能有一個字元
[abc],[aA],[Cc]at,[a-z]
[^ab] 除了ab之外的任意單個字元
[^] 取反
也可以支援指定字元集
[:upper:] 大寫字母
[:lower:] 小寫字母
[:digit:] 數字
[:alpha:] 所有字母
[:alnum:] 字母數字
[:space:] 空字元,tab和space
[:punct:] 标點符号
使用方法[[:upper:]] 取反 [^[:upper:]]
?比對相面的字元0次或1次
ab?c
abc abbc ac abbc肯定不行,因為隻可以出現1次或0次
X\{m,n\} X字元至少出現m次 至多出現n次
X\{m,\} 至少出現m次,至多不限
X\{0,n\} 至多出現n次,至少不限
使用方法grep "[[:space:]]\{1,\}" test
注意:
grep "[[:space:]]\{1,\}" test
grep "[^[:space:]]\{1,\}" test
兩者在文本中沒有全空行的情況下效果一樣,因為取反隻是取非全空行,就字元就滿足
錨定符
^行首錨定
grep "^r..t" /etc/passwd
$行尾錨定
^$空白行錨定
grep "^$" test
單詞錨定符号(單詞連續的字母,不包含特殊字元)
\<詞首錨定 或 \b
grep "\<r..t" /etc/passwd
grep "\br..t" /etc/passwd
\>詞尾錨定 或 \b
grep "r..t\>" /etc/passwd
grep "r..t\b" /etc/passwd
\<\>精确比對 或 \b\b
grep "\<r..t\>" /etc/passwd
grep "\br..t\b" /etc/passwd
\(\)後向引用(前面是某個單詞,後面是某個單詞+x)
grep "\(l..e\).*\1r" text 截取包含以l..e開頭後面任意字元直到相同l..e後加r的行
Grep選項
-v對結果取反
-i忽略字母大小寫
-o僅顯示比對到字元串
-E支援擴充正規表達式
-A顯示比對行以及該行之後的行 + num 行号
-B之前
-C上下文
\(\) --> ()
\{\} --> ()
+次數比對,比對其前的字元至少1次
|或者 {C|c} Cat or cat
C|cat C or cat
小練習
1、查找目前系統上名字為user1使用者賬号的相關資訊在/etc/passwd,包含user11、myuser1
grep "^\buser1\b" /etc/passwd 考慮屬組,錨定行首
查找形如user*這樣的使用者賬戶資訊
grep "^user[0-9]\{1,\}\b" /etc/passwd
2、查找目前系統上以其為附加組的使用者有兩個或兩個以上的組的相關資訊,/etc/group
grep "," /etc/group 附加組必然有逗号
grep "," /etc/group | cut -d: -f1隻顯示這樣組的組名
3、查找目前系統上其使用者賬号密碼最長使用期為99999天的使用者賬戶的相關資訊
思路先确定最長使用時間的位置:
使用者名:密碼:最後修改時間:2次修最少改間隔:2次改最大間隔:警告:閑置:過期:保留
4、分析/etc/inittab檔案中如下兩行的文本特征,寫出可以精确找到類似兩行的模式.
形如:l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
思路:切片num,引用num
grep "^l\(.\):\1:.*\1$" /etc/inittab
grep "^l\([0-9]\{1,\}\):\1:.*\1$" /etc/inittab
5、顯示/proc/meminfo檔案中不區分大小寫的s開頭的行
grep "^[Ss]" /proc/meminfo
6、顯示/etc/passwd中以nologin結尾的行
grep "nologin$" /etc/passwd
7、顯示/etc/inittab中以#開頭,且後跟一個或者多個空白字元串,而後跟任意非空白字元
grep "^#[[:space:]]\{1,\}[^[:space:]]*" /etc/inittab
8、顯示/etc/inittab 中包含了 :num: 兩個冒号中間一個數字的行
grep ":[0-9]:" /etc/inittab
9、顯示/boot/grub/grub.conf檔案中以一個或多個空白字元開頭的行
grep "^[[:space:]]\{1,\}" /boot/grub/grub.conf
10、顯示/etc/inittab檔案中以一個數字開頭并以一個與開頭數字相同的數字結尾的行
grep "^\([0-9]\).*\1$" /etc/inittab
11、顯示出/etc/inittab中非空白的行
grep -v "^$" /etc/inittab
12、取出目前系統上以eth開頭的網絡裝置的IP位址
ifconfig | grep -A 1 'eth' | grep -o "addr:[0-9.]\{1,\}" | cut -d: -f2
13、查詢ifconfig中1位或者2位數字的行
ifconfig | grep -E "\b([1-9]|[1-9][0-9])\b"
本文轉自 ftmoonfans 51CTO部落格,原文連結:http://blog.51cto.com/soulboy/1224213