摘要:在Linux的命令行里如何快速檢索出所需數據,這對用戶來說是非常重要的。查詢條件需要構造正確的正則表達式,該文結合查詢命令grep,介紹了相關參數和正則表達式的使用。
關鍵詞:檢索;正則表達式;grep;Linux
中圖分類號:TP316 文獻標識碼: A文章編號:1009-3044(2008)35-2540-02
The Use of the Regular Expression and Grep in Linux
ZHONG jing,CHENG Xiao-feng
(College of Mathematics and Computer Science, Chongqing Three Gorges University, Chongqing 404000, China)
Abstract: In Linux, it's important to retrieve the data that the user wanted in the command line. Regular expression should be correct in query conditions. On the basis of the command grep, this paper studies many parameters and introduce the use of the regular expression in example.
Key words: retrieve; regular expression; grep; Linux
1 引言
一個正則表達式,就是用某種模式去匹配一類字符串的一個公式。幾乎在計算機應用的所有領域都能看到它的身影。從操作系統(Unix、Linux),程序語言(Java、PHP),到各種文本編輯軟件、類庫(Rogue Wave的tools.h++)、腳本工具(awk、JavaScript),像Microsoft的Visual C++這種交互式IDE也支持它。由此可見,正則表達式已經超出了某種語言或某個系統的局限,成為人們廣為接受的概念和功能。只要掌握了正則表達式,可以把數小時辛苦而且易錯的文本處理工作壓縮在幾分鐘(甚至幾秒鐘)內完成。
本文結合Linux操作系統下的grep命令介紹了正則表達式的使用。
2 正則表達式
什么是正則表達式(Regular Expression,簡稱RE)?簡單的說,我們可以通過“字符串以及一些特殊字符的輔助”來進行文字的對比工作,讓使用者篩選自己所需要的數據。這些特殊的字符與搭配使用的工具,就構成了正則表達式的主軸。RE的用途主要是用來做為搜尋字符串之用,匹配文件里面的內容和用來過濾特殊信息等用途。
例如,在Linux系統,/etc/rc.d/ init.d 這個目錄,如果要找到一個文件內容含有“mail”這個字符串的文件名,利用 grep命令,配合“mail”以及萬用字符“*”來搜尋所有的文件名就可以了。如grep‘mail’/etc/rc.d/init.d/*。
3 正則表達式的作用
3.1 正則表達式對于系統管理員的用途
對于系統管理員,正則表達式則是一個“不可不學的好東西!”系統如果在繁忙的情況之下,每天產生的信息會多到你無法想象,而我們也都知道,系統的“錯誤信息登錄文件”的內容記載了系統產生的所有信息。當然,這包含系統是否被“入侵”的紀錄數據。但是系統的數據量太大,系統管理員每天去看這么多的信息數據是不可能的。這個時候,我們就可以通過“正則表達式”的功能,將這些登錄的信息進行處理,僅取出“錯誤”的信息來進行分析。
3.2 正則表達式的廣泛用途
除了系統管理員之外,一大堆的軟件與設定都是支持正則表達式的。最常見的例子就是“郵件服務器”。您是否有常常收到電子郵件里最讓人頭痛的“廣告信件”呢?如果在Server端將廣告信件剔除,客戶端就會減少很多不必要的頻寬損耗了。如何剔除廣告信件呢?由于廣告信件幾乎都有一定的標題或者是內容,因此,只要每次有來信時,都先將來信的標題與內容進行特殊字符串的對比,使用正則表達式發現有不良信件就予以剔除。目前兩大服務器軟件sendmail與postfix都支持正則表達式的對比功能。很多服務器軟件、以及套件也都支持正則表達式。
4 grep命令
4.1 gerp命令基本用法
語法:[root @test /root ]# grep [-acinv] ‘搜尋字符串’filenames-list
說明:grep 是一個很常見的指令,最重要的功能就是進行字符串數據的對比,需要說明的是grep 在一個文件中查尋一個字符串時,他是以“整行”為單位來擷取數據。grep 是最簡單的正則表達式搜尋指令之一,他并不支持一些更嚴謹的正則表達式內容。不過,已經相當好用。
例1:[root @test /root]# grep‘root’ /var/log/secure
搜索/var/log/secure 這個文件中包含 root 的行。
例2:[root @test /root]# grep -v‘root’/var/log/secure
搜索/var/log/secure 這個文件中沒有 root 的行。
例3:找出regexp.txt這個文件里面含有 “know”字符,并將行號列出來。注意,大小寫是不一樣的。
[root @test /root ]# grep -n 'know' regexp.txt
例4:找出regexp.txt這個文件里面含有 “*” 這個字符,并將行號列出來。
[root @test /root ]# grep -n '\\*' regexp.txt
例5:將所有“know” 不論大小寫都列出來,并列出行號。
[root @test /root]# grep -ni 'know' regexp.txt
類似的指令還有egrep、awk、gawk、sed等。
4.2 正則表達式的特殊字符的使用
特別留意的是,正則表達式的特殊字符“*”與一般在指令列輸入指令的萬用字符并不相同。在萬用字符中,“* ”代表的是 0 ~ 無限多個字符,但是在正則表達式當中,“* ”則是重復前一個字符的意思。使用的意義并不相同。
例6:在 /etc下,列出只要含有“XYZ” 三個字符的任何一個字符的那一行。
grep [XYZ] /etc/*
例7:在 /etc 里面,只要句首是“ w-z” 的就將其列出。
grep ^[w-z] /etc/*
4.3 diff指令
diff是比較兩個文件內容是否有不一致的指令。
語法:[root @test /root ]# diff file1 file2
例8:[root @test /root]# diff index.htm index.html
例9:ls –l | grep ‘^d’ 查詢子目錄
注意:使用正則表達式要養成良好的習慣,就是在匹配模式的兩端加上‘’。這樣和shell的文件通配符號區別開。
4.4 充分正則表達式專用字符
說明:t+ 匹配一個或一個以上連續的t,如t tt ttt 。t? 匹配0個或1個t ,如 t 或 ‘ ’ 。“create | stream “ 和兩種模式的任一種進行匹配。
5 結論
在這篇文章中,介紹了正則表達式的強大功能。只要正確運用,正則表達式能夠在字符串提取和信息過濾中起到很大的作用。另外,還介紹了如何在Linux操作系統的命令行中如何將grep命令和正則表達式結合應用。由于嚴謹度的不同,正則表達式之上還有更嚴謹的延伸正則表達式。
參考文獻:
[1] 金潔珩,王娟,等.Red Hat Linux 9系統管理[M].北京:機械工業出版社,2004.
[2] 尼格斯.Red Hat Fedora和Enterprise Linux4寶典[M].北京:人民郵電出版社,2007.
[3] Steve Mansour.正則表達式之道[EB/OL].http://baike.baidu.com/view/94238.htm
[4] 關于正則表達式的理解[EB/OL].http://hi.baidu.com/zheng918/blog/item/90f8f403a7e0c9713912bbb9.html