在Linux下正則表達式和grep命令的使用
正規(guī)表示法( Regular Exdivssion,RE )
1 什么是正規(guī)表示法:
什么是正規(guī)表示式 ( Regular Exdivssion, 底下簡稱 RE ) 呢?
這些特殊的字符與搭配使用的工具,就構(gòu)成了正規(guī)表示法的主軸!
例如 /etc/rc.d/init.d 這個目錄當中好了,如果你要找到一個文件
2 正規(guī)表示法對于系統(tǒng)管理員的用途:
對于系統(tǒng)管理員來說,正規(guī)表示法則是一個『不可不學的好東西!』由于系統(tǒng)如果在繁忙的情況之下,每天產(chǎn)生的訊息
3 正規(guī)表示法的廣泛用途:
除了系統(tǒng)管理員之外,一大堆的軟件與設(shè)定都是支持正規(guī)表示法的,最常見的例子就是『郵件服務器』!您是否有常常收到電子郵件里最讓人詬病 的『
4 grep
語法:[root @test /root ]# grep [-acinv] '搜尋字符串' filenames-list
參數(shù)說明:
-a :將 binary 文件以 text 文件的方式搜尋數(shù)據(jù)
-c :計算找到 '搜尋字符串' 的次數(shù)
-i :忽略大小寫的不同,所以大小寫視為相同
-n :順便輸出行號
-v :反向選擇,亦即顯示出沒有 '搜尋字符串' 內(nèi)容的那一行!
范例:
[root @test /root]# grep 'root' /var/log/secure
搜索 /var/log/secure 這個文件中包含 root 的行
[root @test /root]# grep -v 'root' /var/log/secure
搜索沒有 root 的行
[root @test /root]# grep [A-Z]ANPATH /etc/man.config
說明:grep 是一個很常見的指令,最重要的功能就是進行字符串數(shù)據(jù)的比對了,需要說明的是『grep 在一個文件中查尋一個字符串時,他是以"整行"為單位來數(shù)據(jù)的擷取的!』
grep 是最簡單的正規(guī)表示法搜尋指令之一,他并不支持一些更嚴謹?shù)恼?guī)表示法內(nèi)容,不過,已經(jīng)相當?shù)暮糜谩?
例題一:找出這個文件里面含有 know 這個字符,并將行號列出來:注意,大小寫是不一樣的
[root @test /root ]# grep -n 'know' regexp.txt
例題二:找出這個文件里面含有 * 這個字符,并將行號列出來:
[root @test /root ]# grep -n '\*' regexp.txt
例題三:我要將所有 know 不論大小寫都列出來,并列出行號:
[root @test /root]# grep -ni 'know' regexp.txt
注意:類似的指令還有egrep、awk、gawk、sed等,將在后面詳細說明
5 正規(guī)表示法的特殊字符(charaters)與 egrep 指令
特殊字符 表示意義
^word 待搜尋的字符在行首
word$ 待搜尋的字符在行尾
. 匹配任何一個可能的字符
\ 跳脫符號將特殊字符變成普通字符
? 任何一個『單一』字符
* 匹配模式中重復的字符
[list] 列表中的字符
[range] 列表中范圍內(nèi)的字符
[^list] 反向選擇,與 [list] 相反
[^range] 反向選擇,與 [range]相反
\{n\} 與前一個相同字浮連續(xù) n 個
\{n,m\} 與前一個相同字浮連續(xù) n-m 個
請?zhí)貏e留意的是,『正規(guī)表示法的特殊字符』與一般在指令列輸入指令的『萬用字符』并不相同,例如,在萬用字符當中, * 代表的是 0 ~ 無限多個字符的意思,但是在正規(guī)表示法當中, * 則是重復前一個字符的意思~使用的意義并不相同,不要搞混了!
例題:在 /etc 底下,只要含有 XYZ 三個字符的任何一個字符的那一行就列出來
grep [XYZ] /etc/*
例題:我想要知道在 /etc 里面,只要句首是 w-z 的就將他印出來?
grep ^[w-z] /etc/*
6 diff比較兩個文件內(nèi)容是否有不一致的指令!
語法:[root @test /root ]# diff file1 file2
范例:[root @test /root]# diff index.htm index.html
例子:ls –l | grep ‘^d’ 查詢子目錄
注意:使用規(guī)則表達式要養(yǎng)成良好的習慣,就是在匹配模式的兩端加上‘’。這樣和shell的文件通配符號做區(qū)別
7 充分規(guī)則表達式專用字符
符號 執(zhí)行
pattern1 | pattern2 邏輯或
(patten) 對模式進行分組
char+ 搜索前面字符的一個或者多個重復實例
char? 搜索前面字符的一個或者0個實例
例題:t+ 匹配一個或一個以上連續(xù)的t,如t tt ttt
t? 匹配0個或1個t 如 t 或 ‘ ’
“create | stream “ 和兩種模式的任一種進行匹配
重點回顧
? shell文件匹配字符和規(guī)則表達式的區(qū)別
shell文件匹配字符是用于匹配文件名
正規(guī)表示法RE的用途主要是用來做為『搜尋』字符串之用,匹配的文件里面的內(nèi)容和用來過濾特殊訊息等用途;
? 由于嚴謹度的不同,正規(guī)表示法之上還有更嚴謹?shù)难由煺?guī)表示法;
? 正規(guī)表示法的處理方式,經(jīng)常是以『整行』或稱為『整段』來進行處理的;
? grep 與 egrep 在正規(guī)表示法里面是很常見的兩支程序,其中, egrep 可以用不同的
posted on 2007-09-25 00:34 旅途 閱讀(282) 評論(0) 編輯 收藏 引用 所屬分類: Linux Shell