2010年2月17日

Regular Expression (Regex, Regexp) 心得-1: 如何過濾符合樣式 (pattern) 的資料 (shell command: grep –v / egrep -v)

最近花了一些時間研究 Regular Expression,有種相見恨晚的感覺,花時間投資學習這個工具的報酬率真的非常高,因為各種OS平台(Windows, Unix/Linux, Solaris, …)、各種程式語言(shell script, Perl, JavaScript, C#, …)都有支援,應用層面非常廣,只要學一次,到處都可以應用,真的是非常划算阿!

這次學 Regular Expression 我是看朝陽科技大學洪朝貴教授的講義:一輩子受用的Regular Expressions:兼談另類的電腦學習態度,非常值得反復研讀(會用到Linux & Perl),特別是講義裡面連到的另一篇文章:如何有效學習電腦 (Aug 2001 重新整理),更是值得細讀、好好思考。以下節錄幾段我覺得寫的很棒的:

學習高組合性軟體還有另外一個優點。 資訊科技進步迅速, 而資訊市場更是變化驚人, 我們很難預測那些軟硬體未來會有較佳的就業市場。 學一套多功能聚集於一身但與他人溝通不良的「萬能」軟體, 就像是把所有的雞蛋放在同一個籃子裡一樣危險。


附帶而來的好處, 就是 學習組合軟體, 知識的壽命長, 經驗可以累積。


能夠拿來與其他知識組合運用的知識, 才是投資報酬率高, 生命週期長的知識。 眼光放遠, 慎選所學軟體, 培養組合能力, 讓你的新知識與舊知識發揮相乘的效果, 讓生產力曲線成指數成長! (感謝 GNU 文件的啟發, 本文觀念來自 info -f textutils "Opening the software toolbox" 一節; 也請參考我的 linux 講義當中 「組合的力量」 當中的具體操作實例.)


另外舉一個例子,最近在黑暗大的blog看到一篇:MEMO- 用Javascript RegExp將<x>置換成<span class='x'>,也是一個很實用的例子,在 coding 時當然可以依賴 IDE 提供的搜尋/取代功能,但如果利用程式直接修改 memory 的資料,或者要處理從DB中撈出來的資料,最省時省力的方法還是 RegExp!

(附帶一提,如果只是要把 <c> 換成 <span>, 程式只要以下兩行即可:
var regex = /[<](\/?)c\d>/g;
s = s.replace(regex, "<$1span>");
不用拆成兩段!就算用IDE的搜尋/取代功能也無法一次到位阿!)

ok, 以上的廣告好文推薦時間結束之後,接下來進入本日主題:如何把符合樣式 (pattern) 的樣式過濾掉,只顯示「不符合」樣式的資料?

通常學 RegExp 都在探討怎樣從一堆資料中找出「符合」樣式的字串,很少有資料講到如何顯示「不符合」樣式的資料!但是有時候其實很多資料都是雜訊(例如information log),沒有先過濾掉的話,很容易漏掉真正重要的資料,那麼要怎樣把「符合」樣式的資料過濾掉呢?

經過一段時間的摸索,我發現在 Linux / Unix 裡面,有個非常好用的 shell command: grep,只要加上 -v 這個 switch 就可以達到這樣的效果!-v 的作用如下:
-v, --invert match
Invert the sense of matching, to select non-matching lines.



所以我只要下這個command,就可以過濾掉含有「cat」的資料了:
cat /var/log/messages | grep –v cat


接下來的問題是,如果要過濾多個條件怎麼辦?例如我要過濾掉「有出現 cat 或 dog 或 bat 的資料」,要怎麼做呢?最直覺的想法就是利用 pipe (管線命令) 的功能,一層一層的過濾,指令大概會長的像下面這樣:

cat /var/log/messages | grep –v cat | grep –v dog | grep –v bat


這樣的命令當然很好懂,但同時也很冗長!

再經過一陣摸索之後,我發現可以用 egrep 來解決這個問題,如正規表示式的入門與應用(三)文中所說的 (這篇文章是在 Google 搜尋「egrep」的第一名),利用 egrep 所支援的「|」(邏輯 or) 關鍵字可將指令簡化,簡化後的指令如下:

cat /var/log/messages | egrep –v ‘cat|dog|bat’


這樣是不是簡潔很多呢!要特別注意的是,「|」的前後不能多出空白,否則那些條件會僅剩下最後一個有效喔!(不要加上 -v 的話就是直接列出有 cat 或有 dog 或有 bat 的資料)


以上是 Regular Expression 的好文推薦 + grep / egrep 實例演練,之後會持續整理實務上有應用到的 Regexp 實例,敬請拭目以待 :D

沒有留言:

Google Spreadsheet 裡用規則運算式

最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D