站長新書 站長開講 首頁 最新文章 站長著作及審校 FreeBSD 筆記 Linux 筆記 Windows 筆記 虛擬化筆記 網管人雜誌 遊山玩水 關於本站
站長新書 VMware vSphere ICM 團購開跑了!!

邁向 RHCE 之路 (Day09) - 正規表示式 (Regular Expression)

前言

常用來配合 Regular Expression 的指令有 grep、swk、sed、vi、less,不過下列提到的 Regular Expression 字元與之前提到的萬用字元不同,且建議使用 Regular Expression 時前後使用單或雙引號括住。例如使用者帳號中有 wei 及 weithenn 若我們想使用 grep 來尋找 wei 使者用帳號則會連 weithenn 使用者帳號也一併列出,此時我們便可利用 Anchors (定錨點) 來配合處理。

 #grep wei /etc/passwd
  weithenn:x:500:500::/home/user/weithenn:/bin/bash
  wei:x:501:501::/home/user/wei:/bin/bash

我們透過 Anchors (定錨點) 來指定搜尋 /etc/passwd 內容時僅搜尋開頭為 wei: 內容。

 #grep '^wei:' /etc/passwd
  wei:x:501:501::/home/user/wei:/bin/bash

知道了 Regular Expression 好用之處後開始介紹常用的過濾字元

萬用字元 (Wildcard Characters)

修改 (Modifies)

定錨點(Anchors)

Wildcard Characters (萬用字元) 練習

檔案 people 中有五個人名分別為 chris、christina、chloe、wei、weithenn 利用上述的 Wildcard Characters (萬用字元) 來對其搜尋內容進行過濾。

 #cat employee
  chris
  christina
  chloe
  wei
  weithenn
 #grep ch employee        //搜尋開頭為 ch 相關名字
  chris
  christina
  chloe
 #grep wei. employee      //搜尋開頭為 wei 後接任一字元 (any single char)
  weithenn
 #grep ch[a-m] employee   //搜尋開頭為 ch 後面字元為 a ~ m 之間的字元 (char in range)
  chloe
 #grep ch[^a-m] employee  //搜尋開頭為 ch 後面字元排除 a ~ m 之間的字元 (not in range)
  chris
  christina
 #grep ch[r] employee     //搜尋開頭為 ch 後面字元為 r 的字元 (char in set)
  chris
  christina
 #grep ch[lr] employee    //搜尋開頭為 ch 後面字元為 l、r 的字元 (char in set)
  chris
  christina
  chloe

Modifies 練習

檔案 xyz 中分別有不同字串長度的 x、y、z,利用 Modifies 來對其搜尋內容進行過濾。

 #cat xyz
  x
  xx
  xxx
  y
  yy
  yyy
  z
  zz
  zzz
  xyz
  xxyyzz
  zyxxyz
 #grep "x*" xyz       //搜尋 x 後面字元為 0 個 x 或以上的其它字元 
  x
  xx
  xxx
  y
  yy
  yyy
  z
  zz
  zzz
  xyz
  xxyyzz
  zyxxyz
 #grep "x\+" xyz     //搜尋開頭為 x 後面字元為 1 個 x 或以上的字元 
  x
  xx
  xxx
  xyz
  xxyyzz
  zyxxyz
 #grep "x\?yz" xyz    //搜尋為 x 與 yz 中間字元為 0 或 1 個以上的其它字元   
  xyz                 //符合 0 個字元 xyz
  xxyyzz              //符合 1 個字元 xyyz 
  zyxxyz              //符合 1 個字元 xxyz
 #grep "x\{2\}" xyz   //搜尋 2 個(含) x 字元的字串 (i 個 previous-char)
  xx
  xxx
  xxyyzz
  zyxxyz
 #grep "x\{3,\}" xyz  //搜尋 3 個(含) x 字元的字串 (比 i 多 previous-char)
  xxx

Anchors (定錨點) 練習

檔案 bad 中分別有不同字串長度的文字,利用 Anchors (定錨點) 來對其搜尋內容進行過濾。

 #cat baby            //檔案 baby 內容
  baby
  babylon
  babysitter
 #grep "^ba" baby    //搜尋檔案中每行開頭為 ba 的字串 (line begin with)
  baby
  babylon
  babysitter
 #grep "er$" baby    //搜尋檔案中每行結尾為 er 的字串 (line end with)
  babysitter
 #grep "^baby$" baby //搜尋檔案中每行開頭及結尾為 bad 的字串
  baby
 #grep "\<ba" baby   //搜尋檔案中含有 ba 開頭的字串 (word begin with)
  baby
  babylon
  babysitter
 #grep "on\>" baby   //搜尋檔案中含有 on 結尾的字串 (word end with).
  babylon

最後來個 Regular Expression 綜合練習,查詢檔案內容中取出您要的條件字串

 #cat test                       //列出檔案 test 內容
  123456789012345678901234567890
  abcdefghij12345678
  www.weithenn.org
  aaaaabbbbbcccccdddddeeeee
  aaaaa tw.yahoo.com deeeee
  weithenn
  chris
 #grep '^[a-z 0-9]\{5\}$' test   //搜尋字串開頭為 a ~ z 及 0 ~ 9 結尾的字串且字元數為 5
  chris
 #grep '^[a-z 0-9]ww' test       //搜尋字串開頭為 a ~ z 及 0 ~ 9 字串文字開頭為 w
  www.weithenn.org
 #grep 'n[a-z 0-9]$' test        //搜尋字串結尾為 a ~ z 及 0 ~ 9 結尾的字串文字為 n
  weithenn

Windows 與 Unix-Like 檔案格式轉換 (dos2unix、unix2dos)

由於 Windows 與 Unix-Like 對於內容中 換行字元 的處理方式不同,因此便會發生您在 Windows 上修改好檔案內容而上傳至 Unix-Like 環境執行時發生問題,此時便為換行符號所導致,這時便可利用簡單的指令來進行檔案格式內換行字元的轉換,我們可使用 cat -A 來對檔案進行查看檔案內容即可知為 Windows 格式或 Unix-Like 格式,如下檔案 f1 為 Unix-Like 格式而 f2 為 Windows 格式可發現其換行字元的不同。

 #cat -A f1   //Unix-Like 格式
  a$
  b$
  c$
  d$
  e$
 #cat -A f1   //Windows 格式
  a^M$
  b^M$
  c^M$
  d^M$
  e^M$

我們也可透過指令 od 來查看檔案的 ASCII 碼,可發現 Unix-Like 格式其換行字元為 \n (10 New Line) 而 Windows 格式其換行字元為 \r \n (13 Carriage Return 及 10 New Line) 所組成。

 #od -t c f1
  0000000   a  \n   b  \n   c  \n   d  \n   e  \n
  0000012
 #od -t c f1
  0000000   a  \r  \n   b  \r  \n   c  \r  \n   d  \r  \n   e  \r  \n
  0000017

因此我們可以使用指令 dos2unix、unix2dos 顧名思義這二個指令即對檔案內容的換行字元進行處理。

 #cat -A f1     //Unix-Like 格式
  a$
  b$
  c$
  d$
  e$
 #unix2dos f1  //執行轉換換行字元指令 (Unix-Like -> Windows)
  unix2dos: converting file f1 to DOS format ...
 #cat -A f1    //Windows 格式
  a^M$
  b^M$
  c^M$
  d^M$
  e^M$
 #dos2unix f1  //執行轉換換行字元指令 (Windows -> Unix-Like)
  dos2unix: converting file f1 to UNIX format ...
 #cat -A f1    //Unix-Like 格式
  a$
  b$
  c$
  d$
  e$
Go To Oddmuse OrgGo To FreeBSD OrgCreative Commons 2.5 Taiwansitestates.com