一:grep的簡介:
文本搜索工具,根據用戶指定的文本模式對目標文件進行逐行搜索,顯示能夠被模式所匹配到的行。配合正則表達式的使用可以實現強大的文本處理。下面一一說明正則的例子。
二:文本處理工具分類
常用的有:grep,egrep,fgrep。
區別:
grep:在沒有參數的情況下,只輸出符合RE(Regular Expression)字符。
egrep:等同於grep -E,和grep最大的區別就是表現在轉義符上比如grep 做次數匹配時\{n,m\}egrep則不需要直接{n,m}。egrep方便,簡介。
fgrep:等同於grep -f,但是不能使用正則表達式。所有的字符匹配功能均已消失。
三:grep參數說明:
格式:grep [OPTIONS] PATTERN(模式) [FILE...]
常用選項:
--color=auto:顯示顏色的參數。
-n:輸出行號。
-v:反向匹配,顯示不能被模式所匹配到的行。比如指定root,匹配的就不是root。
例子:
-o:僅顯示被模式匹配到的所指定的字符。
-i:不區分大小寫字符。
-A #:不但能匹配到指定的字符那一行。而且字符后面所指定的n行也能顯示出來。
-B #:不但能匹配到指定的字符那一行。而且字符前面所指定的n行也能顯示出來。
-B #:不但能匹配到指定的字符那一行。而且字符前面所指定的n行也能顯示出來。
-C #:不但能匹配到指定的字符那一行。而且字符前后所指定的n行也能顯示出來。
為了方便我把grep --color=auto定義一個別名,別名為cgrep。方便使用。后續直接使用cgrep 就能顯示顏色了。
alias cgrep="grep --color=auto"
四:常用的字符匹配和實例:
只要使用字符匹配和一些元字符的時候,必須用引號引起來;
引號用單引或雙引都即可。
.:任意單個字符,指的就是一個點代表1個字符。這個字符不特殊指分,符號也行。
[]:指定范圍內的任意單個字符。這個括號中指定的字符都能匹配出來,匹配范圍廣。
[^]:指定范圍外的任意單個字符,和上面[]這個想法。取反。通俗的意思就是括號中所指定的字符,就匹配不到了。
1 [[:digit:]]:表示所有的數字。
2 [[:lower:]]:表示小寫字母。
3 [[:upper:]]:表示大寫字母。
4 [[:alpha:]]:表示全部的大寫和小寫字母。
5 [[:alnum:]]:表示全部的字母和數字。
6 [[:space:]]:表示空格符。
7 [[:punct:]]表示標點符號。
例子如下:
[[:digit:]]:表示所有的數字。
[[:lower:]]:表示小寫字母。
[[:upper:]]:表示大寫字母。
[[:alpha:]]:表示全部的大寫和小寫字母。
[[:alnum:]]:表示全部的字母和數字。
[[:space:]]:表示空格符。
[[:punct:]]表示標點符號。
六:次數匹配:
*:任意次,意為匹配的字符中,有任意個字符都行。
.*:匹配任意長度的任意字符。
\?:匹配其前面的字符0次或1次;"a\?b"指的就是a后面到b中間可以有一個字符或者什么都沒有。
七:貪婪模式匹配:盡可能的去匹配。永無止境。
\{m\}:匹配m次;
\{m,n\}:至少m次,最多n次;
\{m,\}:至少m次;多的話貪婪匹配。
\{0,n}:至多n次;
八:位置錨定匹配:用於指定字符出現的位置。
^:用於錨定行首。
$:用於錨定行尾。
^$:錨定空白行
\<或\b錨定詞首。
\>或\b錨定詞尾。
九:分組
\(\):指的就是括號里面的字符屬於一個組。在一塊的就匹配顯示出來。
十:引用
1\:后向引用,引用前面的第一個左括號以及與之對應的右括號中的模式所匹配到的內容。
2\:后向引用,引用前面的第二個左括號以及與之對應的右括號中的模式所匹配到的內容。
下面講解Egrep擴展正則表達式:功能和grep 有區別的地方下面會舉例說名。
字符匹配:
.:任意單個字符。
[]:指定范圍內的任意單個字符。
[^]:指定范圍外的任意單個字符。
次數匹配:
*:匹配其前面的字符任意次。
?:匹配其前面的字符0次或1次。
+:匹配其前面的字符至少1次。
{m}:匹配其前面的字符m次。這里可以看出來了和grep區別是少了轉義符\。
{m,n}:至少m次,至多n次。
{m,}:至少m次。
{0,n}:至多n次。
錨定匹配:
^:行首錨定。
$:行尾錨定。
\<或\b:詞首錨定。
\>或\b:詞尾錨定。
分組匹配:
():分組。
|:或者,ac|bc。匹配ac和bc所在的字符。
fgrep:相當於grep -f,不解析正則表達式。
以上就是基本的使用。
下面通過例子在演示一下。
練習:
1)顯示/proc/meminfo文件中以大小寫s開頭的行:
2)顯示默認/etc/rc.d/rc.sysinit文件中,以#開頭,后面至少一個空白字符,而后又有至少一個非空白字符的行。
egrep "^#[[:space:]]{1,}[^[:space:]]{1,}" /etc/rc.d/rc.sysinit
3)顯示/boot/grub/grub.conf中以至少一個空白字符開頭的行。
4)找出/etc/inittab文件中以為數和兩位數:
5)找出用戶名和shell相同的用戶。
6)找出netstat -tan命令執行的結果中以"LISTEN"或“ESTABLISHE"結尾的行。
netstat -tan| egrep "(LISTEN|ESTABLISHED)"