Linux下Regex和grep命令的使用

來源:互聯網
上載者:User

使用規則運算式要養成良好的習慣,就是在匹配模式的兩端加上‘’。這樣和shell的檔案萬用字元號做區別。 
  正規標記法( Regular Exdivssion,RE )

  1 什麼是正規標記法:

  什麼是正規表示式 ( Regular Exdivssion, 底下簡稱 RE ) 呢?簡單的說,在 Linux 的環境下,我們可以透過『字串以及一些特殊字元的輔助』來進行文字的比對工作,好來讓使用者篩選自己所需要資料。

  這些特殊的字元與搭配使用的工具,就構成了正規標記法的主軸!

  例如 /etc/rc.d/init.d 這個目錄當中好了,如果你要找到一個檔案內容含有 mail 這個字串的檔案名稱,要怎麼搜尋呢?利用 grep 配合 mail 以及萬用字元來搜尋所有的檔案名稱『grep 'mail' /etc/rc.d/init.d/*』

  2 正規標記法對於系統管理員的用途:

  對於系統管理員來說,正規標記法則是一個『不可不學的好東西!』由於系統如果在繁忙的情況之下,每天產生的訊息資訊會多到你無法想象的地步,而我們也都知道,系統的『錯誤訊息登入檔案』 的內容記載了系統產生的所有訊息,當然,這包含你的系統是否被『入侵』的紀錄資料。但是系統的資料量太大了,要系統管理員的 你每天去看這麼多的訊息資料,想不瘋掉都很難,這個時候,我們就可以透過『正規標記法』的功能,將這些登入的資訊進行處理,僅取出『錯誤』的資訊來進行分析。

  3 正規標記法的廣泛用途:

  除了系統管理員之外,一大堆的軟體與設定都是支援正規標記法的,最常見的例子就是『郵件伺服器』!您是否有常常收到電子郵件裡最讓人詬病 的『廣告信件』呢?那如果我在 Server 端就將廣告信件給剔除的話,用戶端就會減少很多不必要的頻寬損耗了對吧!那麼如何剔除廣告信件呢?由於廣告信件幾乎都有一定的標題或者是內容,因此,只要 每次有來信時,都先將來信的標題與內容進行特殊字元串的比對,使用正規標記法發現有不良信件就予以剔除!目前兩大伺服器軟體sendmail 與 postfix 都支援正規標記法的比對功能!很多的伺服器軟體、以及套件都支援正規標記法。

  4 grep

  文法:[root @test /root ]# grep [-acinv] '搜尋字串' filenames-list

  參數說明:

  -a :將 binary 檔案以 text 檔案的方式搜尋資料

  -c :計算找到 '搜尋字串' 的次數

  -i :忽略大小寫不同,所以大小寫視為相同

  -n :順便輸出行號

  -v :反向選擇,亦即顯示出沒有 '搜尋字串' 內容的那一行!

  範例:

  [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 是一個很常見的指令,最重要的功能就是進行字串資料的比對了,需要說明的是『grep 在一個檔案中查尋一個字串時,他是以"整行"為單位來資料的擷取的!』

  grep 是最簡單的正規標記法搜尋指令之一,他並不支援一些更嚴謹的正規標記法內容,不過,已經相當的好用。

  例題一:找出這個檔案裡面含有 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 正規標記法的特殊字元(charaters)與 egrep 指令

  特殊字元 表示意義

  ^word 待搜尋的字元在行首

  word$ 待搜尋的字元在行尾

  . 匹配任何一個可能的字元

  \ 跳脫符號將特殊字元變成一般字元

  ? 任何一個『單一』字元

  * 匹配模式中重複的字元

  [list] 列表中的字元

  [range] 列表中範圍內的字元

  [^list] 反向選擇,與 [list] 相反

  [^range] 反向選擇,與 [range]相反

  \{n\} 與前一個相同字浮連續 n 個

  \{n,m\} 與前一個相同字浮連續 n-m 個

  請特別留意的是,『正規標記法的特殊字元』與一般在指令列輸入指令的『萬用字元』並不相同,例如,在萬用字元當中, * 代表的是 0 ~ 無限多個字元的意思,但是在正規標記法當中, * 則是重複前一個字元的意思~使用的意義並不相同,不要搞混了!

  例題:在 /etc 底下,只要含有 XYZ 三個字元的任何一個字元的那一行就列出來

  grep [XYZ] /etc/*

  例題:我想要知道在 /etc 裡面,只要句首是 w-z 的就將他印出來?

  grep ^[w-z] /etc/*

  6 diff比較兩個檔案內容是否有不一致的指令!

  文法:[root @test /root ]# diff file1 file2

  範例:[root @test /root]# diff index.htm index.html

  例子:ls –l | grep ‘^d’ 查詢子目錄

  注意:使用規則運算式要養成良好的習慣,就是在匹配模式的兩端加上‘’。這樣和shell的檔案萬用字元號做區別。

  7 充分規則運算式專用字元

  符號 執行

  pattern1 | pattern2 邏輯或

  (patten) 對模式進行分組

  char+ 搜尋前面字元的一個或者多個重複執行個體

  char? 搜尋前面字元的一個或者0個執行個體

  例題:t+ 匹配一個或一個以上連續的t,如t tt ttt

  t? 匹配0個或1個t 如 t 或 ‘ ’

  “create | stream “ 和兩種模式的任一種進行匹配

  重點回顧

  • shell檔案匹配字元和規則運算式的區別

  shell檔案匹配字元是用於匹配檔案名稱

  正規標記法RE的用途主要是用來做為『搜尋』字串之用,匹配的檔案裡面的內容和用來過濾特殊訊息等用途;

  • 由於嚴謹度的不同,正規標記法之上還有更嚴謹的延伸正規標記法;

  • 正規標記法的處理方式,經常是以『整行』或稱為『整段』來進行處理的;

  • grep 與 egrep 在正規標記法裡面是很常見的兩支程式,其中, egrep 可以用不同的模式去匹配,以及支援更嚴謹的正規標記法的文法。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.