︿
Top

1、前言

常用來配合 Regular Expression 的指令有 grep、swk、sed、vi、less,不過下列提到的 Regular Expression 字元與之前提到的萬用字元不同,且建議使用 Regular Expression 時前後使用單或雙引號括住。



文章目錄

1、前言
2、常用過濾字元
3、Wildcard Characters (萬用字元) 練習
4、Modifies 練習
5、Anchors (定錨點) 練習
6、Windows 與 Unix-Like 檔案格式轉換 (dos2unix、unix2dos)



2、常用過濾字元

例如 使用者帳號中有 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)

  • .: any single char
  • [abc]: char in set
  • [a-c]: char in range
  • [^abc]: not in set
  • [^a-c]: not in range

修改 (Modifies)

  • *: zero or more previous-char (有或沒有都可以)
  • \+: one or more previous-char (至少 1 個)
  • \?: zero or one previous-char
  • \{i \}: i 個 previous-char
  • \{i,\}: 比 i 多 previous-char

定錨點(Anchors)

  • ^: line begin with
  • $: line end with
  • \<: word begin with
  • \>: word end with



3、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




4、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




5、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




6、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$
文章標籤: