一 簡介
grep (global search regular expression(RE) and print out the line,全面搜索正則表達式并把行打印出來)是一種強大的文本搜索工具,它能使用正則表達式搜索文本,并把匹配的行打印出來。
Unix的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令只跟grep有很小不同。egrep是grep的擴展,支持更多的RE元字符, fgrep就是fixed grep或fast grep,它們把所有的字母都看作單詞,也就是說,正則表達式中的元字符表示回其自身的字面意義,不再特殊。linux使用GNU版本的grep。它功能更強,可以通過-G、-E、-F命令行選項來使用egrep和fgrep的功能。
正則表達式:又稱正規表示法、常規表示法(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE)正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在很多文本編輯器里,正則表達式通常被用來檢索、替換那些符合某個模式的文本。
二 grep用法
1.grep 常用選項:
-v: 顯示不包含匹配文本的所有行。
-o: 僅顯示匹配的字串,而非字串所在的行
-i: 忽略字符大小寫
-n:輸出匹配行的行號
-q:安靜模式,不打印任何標準輸出
-E: 擴展正則表達式,相當于egrep,egrep 擴展正則表達式
-F:固定字符串列表,相當于fgrep,fgrep 不支持正則表達式
-A:顯示被模式匹配到的行及后#行
-B:顯示被模式匹配到的行及前#行
-C:顯示被模式匹配到的行及其前后各#行
–color=auto :可以將找到的關鍵詞部分加上顏色的顯示
2.正則表達式:
a.字符匹配:
. : 匹配任意單個字符,相當于通配符?;
[] : 匹配指定范圍內的任意單個字符;
[^] : 匹配指定范圍外的任意單個字符;
b.常用特殊字符匹配:
[0-9] = [[:digit:]] :匹配數字
[a-z] = [[:lower:]] : 匹配小寫字母
[0-9a-zA-Z] = [[:alnum:]] : 匹配大小寫字母或數字
[a-zA-Z] = [[:alpha:]] : 匹配字母,大小寫字母
[[:space:]] = \s : 匹配空白字符
[A-Z] = [[:upper:]] = : 代表大小字寫母
c. 次數匹配:
* :匹配*前面的單個字符任意次,可以為0次;
.*:匹配任意長度的任意字符;
\?:匹配?前面的字符0或者1次;如果是使用egrep 直接?
\+:匹配+前面的字符至少1次;如果是使用egrep 直接+
\{m,n\}:匹配其左側的字符至少m次,至多n次;如果是使用egrep 直接{m,n}
\{m,\}:匹配其左側的字符至少m次 如果是使用egrep 直接{m,}
\{0,n\}:匹配其左側的字符至多n次 如果是使用egrep 直接{0,n}
\{m\}:精確匹配其左側的字符m次 如果是使用egrep 直接{m}
d. 位置錨定:
^ :錨定行首
$ : 錨定行尾
^$ :匹配空白行,^[[:space:]]$ 一樣的效果
e.單詞錨定:
\< :錨定詞首
\>:錨定詞尾
\<PATTERN\>:匹配PATTERN能匹配到的整個單詞
\b:匹配一個字邊界,即字與空格間的位置
|: 或的意思 a|b 就是匹配a或者是b
f.分組及引用:
\(\) :將()中字符集合到一起作為一個字符引用,如果是使用egrep 直接()
\#:引用,模式中自左而右,而非模式本身
3.正則表達式的貪婪與非貪婪模式
貪婪匹配:正則表達式一般趨向于最大長度匹配,也就是所謂的貪婪匹配。
非貪婪匹配:就是匹配到結果就好,就少的匹配字符。
默認是貪婪模式;在量詞后面直接加上一個問號?就是非貪婪模式。
三 例子
1.將/etc/passwd,有出現 root 的行取出來,同時顯示這些行在/etc/passwd的行號
grep -n root /etc/passwd
2.用 dmesg 列出核心信息,再以 grep 找出內含 eth 那行,要將捉到的關鍵字顯色,且加上行號來表示:
grep -n root /etc/passwd
3.將/etc/passwd,將沒有出現 root 的行取出來
grep -v root /etc/passwd
4.用 dmesg 列出核心信息,再以 grep 找出內含 eth0 那行,在關鍵字所在行的前兩行與后三行也一起捉出來顯示
dmesg | grep -n -A3 -B2 'eth0'
5.搜索cc.txt下aa 關鍵字忽略字母大小寫,命令如下:
grep -i ‘aa' cc.txt
6.在/etc/passwd 查找以root開頭的行
grep "^root" /etc/passwd
7.在/etc/passwd 查找以nologin結尾的行
grep "nologin$" /etc/passwd
創建一個測試文件內容如下
8. 在siaz.txt 文件中匹配以the作為單詞首部的行
grep "\<the" siaz.txt
9.在siaz.txt 文件中匹配以the作為單詞詞尾的行
grep "the\>" siaz.txt
10.在siaz.txt 文件中匹配/etc/passwd中包含單詞"the"的行
grep "\bthe\b" siaz.txt
11.在/etc/passwd中 匹配單個字符 r..t
grep "r..t" /etc/passwd
12.匹配0個或多個重復位于星號前的字符 :從/etc/passwd中匹配rt、rot、root、roo*t
grep 'ro*t' /etc/passwd
13.匹配一組字符中的任意一個, 從/etc/passwd中匹配包含test1或best的行
grep "[tb]est" /etc/passwd
14.匹配/etc/passwd中不包含root的行
grep "^[^root]" /etc/passwd ([^root] 取非root字符,^ 開頭非root的行)
15.匹配/etc/passwd中字母o連續出現2次的行
grep "o\{2\}" /etc/passwd
grep -E "o{2}" /etc/passwd
測試文件bb.txt 內容如下
16.匹配文件bb.txtx 中 最少出現m次,最多出現n次
grep "ro\{2,4\}" bb.txt
grep -E "ro{2,4}" bb.txt
分組測試文件cc.txt 內容如下
17.匹配cc.txt文件中以2016開頭且以2016結尾的行
grep "^\(2016\).*\1$" cc.txt
grep -E "^(2016).*\1$" cc.txt
18.在cc.txt 文件中分組引用w(es)t 中的es
grep "w\(es\)t.*\1" cc.txt
grep -E "w(es)t.*\1" cc.txt
19.匹配cc.txt文件中的數字與大小寫字母
grep "[[:alnum:]]" cc.txt
grep "[0-9a-Z]" cc.txt
20.匹配cc.txt文件的空白鍵
grep "[[:space:]]" cc.txt
21.從/etc/passwd中匹配包含ro字符串,且字母至少出現一次以上的行
grep -E "ro+" /etc/passwd
22.在bb.txt 文件中,匹配其roo前導字符0次或1次
grep -E "roo?" bb.txt
23.從/etc/passwd中匹配test1或best1
grep "[t|b]est1" /etc/passwd
24.在/etc/passwd上查找用戶id和組id在500到1099之間的行
grep "\<1\?[05][0-9][0-9]\>" /etc/passwd
grep -E "\<1?[05][0-9][0-9]\>" /etc/passwd
25.找出ifconfig命令結果中的1-255之間的數字
ifconfig | grep -o -E "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"
26.顯示/etc/passwd文件中其默認shell為/bin/bash的用戶
grep "/bin/bash$" /etc/passwd | sort -t: -k3 -n | tail -1 | cut -d: -f1
原創文章,作者:liangkai,如若轉載,請注明出處:http://www.www58058.com/11156
[…] 轉載:linux運維部落 ? grep,egrp,fgrep 命令與正則表達式 […]