2012年12月3日

CentOS 6.3 學習筆記 (17) - grep & 正規表示式

先用 alias 功能將 grep 用 grep --color=auto 取代
#vi ~/.bashrc
alias grep=’grep --color=auto’
#source ~/.bashrc




特殊符號代表意義
[:alnum:]代表英文大小寫字元及數字,亦即 0-9, A-Z, a-z
[:alpha:]代表任何英文大小寫字元,亦即 A-Z, a-z
[:blank:]代表空白鍵與 [Tab] 按鍵兩者
[:cntrl:]代表鍵盤上面的控制按鍵,亦即包括 CR, LF, Tab, Del.. 等等
[:digit:]代表數字而已,亦即 0-9
[:graph:]除了空白字元 (空白鍵與 [Tab] 按鍵) 外的其他所有按鍵
[:lower:]代表小寫字元,亦即 a-z
[:print:]代表任何可以被列印出來的字元
[:punct:]代表標點符號 (punctuation symbol),亦即:" ' ? ! ; : # $...
[:upper:]代表大寫字元,亦即 A-Z
[:space:]任何會產生空白的字元,包括空白鍵, [Tab], CR 等等
[:xdigit:]代表 16 進位的數字類型,因此包括: 0-9, A-F, a-f 的數字與字元


#grep -n -An -Bn --color=auto ‘字串’ 檔名
-n:列出行號
-An:列出該行及後續n行
-Bn:列出該行及前面n行
--color=auto:將字串上色

#grep -v ‘字串’ 檔名
-v:反向選擇、沒有的才列出

#grep -i ‘字串’ 檔名
-i:不論大小寫

#grep t[ae]st 檔名
[ae]:搜尋 tast 或 test


#grep ‘oo’ 檔名
搜尋字串內有 oo 


#grep ‘[^g]oo’ 檔名
搜尋有 oo 但是前面不是 g 的 ex.goo


#grep ‘[^a-z]oo’ 檔名
搜尋 oo 但是前面不要有小寫英文字母


#grep ‘[a-zA-Z0-9]’ 檔名
搜尋有大小寫英文及數字


#grep ‘[^[:lower:]]oo’ 檔名
搜尋 oo 但是前面無小寫字元


#grep ‘^the’ 檔名
搜尋 the 但只在行首出現


#grep ‘^[a-z]’ 檔名 == grep ‘^[[:lower:]]’ 檔名
搜尋開頭為小寫字母


#grep ‘\.$’ 檔名
搜尋、行尾為小數點(.)的那一行。\為跳脫字元、因為 . 有特別意義


#grep ‘^$’ 檔名
搜尋空白行


#grep -v ‘^$’ 檔名 | grep -v ‘^#’
-v 不要 ^$ 空白行 | 前面的結果再處理 -v 不要 ^# 行首有井字
列出檔案內容、但是不要空白行和行首為 # 的內容

. (小數點):代表’一定有一個任意字元’
* (star):代表’重複前一個字元、0到無限個’

‘g..d’ 代表 gXXd
‘g.d’  代表 gXd
‘o*’ 代表 0 到無限個 o
‘oo*’ 代表最少一個 o
‘ooo*’ 代表最少兩個 o
‘g.*g’ 代表 g 開頭 g 結尾、中間可有可無
‘[0-9][0-9]*’ 任意數字

‘o\{2\}’ 連續兩個 o
‘o\{3\}’ 連續三個 o
‘o\{2,5\}’ 連續兩個到五個 o
‘o\{2,5\}g’ 連續兩個到五個 o 後面再一個 g
‘o\{2,\}g’ 連續兩個以上的 o 後面再一個 g



基礎正規表示法字符彙整 (characters)

RE 字符意義與範例
^word
意義:待搜尋的字串(word)在行首!
範例:搜尋行首為 # 開始的那一行,並列出行號
grep -n '^#' regular_express.txt
word$
意義:待搜尋的字串(word)在行尾!
範例:將行尾為 ! 的那一行列印出來,並列出行號
grep -n '!$' regular_express.txt
.
意義:代表『一定有一個任意字元』的字符!
範例:搜尋的字串可以是 (eve) (eae) (eee) (e e), 但不能僅有 (ee) !亦即 e 與 e 中間『一定』僅有一個字元,而空白字元也是字元!
grep -n 'e.e' regular_express.txt
\
意義:跳脫字符,將特殊符號的特殊意義去除!
範例:搜尋含有單引號 ' 的那一行!
grep -n \' regular_express.txt
*
意義:重複零個到無窮多個的前一個 RE 字符
範例:找出含有 (es) (ess) (esss) 等等的字串,注意,因為 * 可以是 0 個,所以 es 也是符合帶搜尋字串。另外,因為 * 為重複『前一個 RE 字符』的符號, 因此,在 * 之前必須要緊接著一個 RE 字符喔!例如任意字元則為 『.*』 !
grep -n 'ess*' regular_express.txt
[list]
意義:字元集合的 RE 字符,裡面列出想要擷取的字元!
範例:搜尋含有 (gl) 或 (gd) 的那一行,需要特別留意的是,在 [] 當中『謹代表一個待搜尋的字元』, 例如『 a[afl]y 』代表搜尋的字串可以是 aay, afy, aly 即 [afl] 代表 a 或 f 或 l 的意思!
grep -n 'g[ld]' regular_express.txt
[n1-n2]
意義:字元集合的 RE 字符,裡面列出想要擷取的字元範圍!
範例:搜尋含有任意數字的那一行!需特別留意,在字元集合 [] 中的減號 - 是有特殊意義的,他代表兩個字元之間的所有連續字元!但這個連續與否與 ASCII 編碼有關,因此,你的編碼需要設定正確(在 bash 當中,需要確定 LANG 與 LANGUAGE 的變數是否正確!) 例如所有大寫字元則為 [A-Z]
grep -n '[A-Z]' regular_express.txt
[^list]
意義:字元集合的 RE 字符,裡面列出不要的字串或範圍!
範例:搜尋的字串可以是 (oog) (ood) 但不能是 (oot) ,那個 ^ 在 [] 內時,代表的意義是『反向選擇』的意思。 例如,我不要大寫字元,則為 [^A-Z]。但是,需要特別注意的是,如果以 grep -n [^A-Z] regular_express.txt 來搜尋,卻發現該檔案內的所有行都被列出,為什麼?因為這個 [^A-Z] 是『非大寫字元』的意思, 因為每一行均有非大寫字元,例如第一行的 "Open Source" 就有 p,e,n,o.... 等等的小寫字
grep -n 'oo[^t]' regular_express.txt
\{n,m\}
意義:連續 n 到 m 個的『前一個 RE 字符』
意義:若為 \{n\} 則是連續 n 個的前一個 RE 字符,
意義:若是 \{n,\} 則是連續 n 個以上的前一個 RE 字符! 範例:在 g 與 g 之間有 2 個到 3 個的 o 存在的字串,亦即 (goog)(gooog)
grep -n 'go\{2,3\}g' regular_express.txt


延伸正規表示法
命令:grep -E or egrep


RE 字符意義與範例
+
意義:重複『一個或一個以上』的前一個 RE 字符
範例:搜尋 (god) (good) (goood)... 等等的字串。 那個 o+ 代表『一個以上的 o 』所以,底下的執行成果會將第 1, 9, 13 行列出來。
egrep -n 'go+d' regular_express.txt
?
意義:『零個或一個』的前一個 RE 字符
範例:搜尋 (gd) (god) 這兩個字串。 那個 o? 代表『空的或 1 個 o 』所以,上面的執行成果會將第 13, 14 行列出來。 有沒有發現到,這兩個案例( 'go+d' 與 'go?d' )的結果集合與 'go*d' 相同? 想想看,這是為什麼喔! ^_^
egrep -n 'go?d' regular_express.txt
|
意義:用或( or )的方式找出數個字串
範例:搜尋 gd 或 good 這兩個字串,注意,是『或』! 所以,第 1,9,14 這三行都可以被列印出來喔!那如果還想要找出 dog 呢?
egrep -n 'gd|good' regular_express.txt
egrep -n 'gd|good|dog' regular_express.txt
()
意義:找出『群組』字串
範例:搜尋 (glad) 或 (good) 這兩個字串,因為 g 與 d 是重複的,所以, 我就可以將 la 與 oo 列於 ( ) 當中,並以 | 來分隔開來,就可以啦!
egrep -n 'g(la|oo)d' regular_express.txt
()+
意義:多個重複群組的判別
範例:將『AxyzxyzxyzxyzC』用 echo 叫出,然後再使用如下的方法搜尋一下!
echo 'AxyzxyzxyzxyzC' | egrep 'A(xyz)+C'
上面的例子意思是說,我要找開頭是 A 結尾是 C ,中間有一個以上的 "xyz" 字串的意思~


http://linux.vbird.org/linux_basic/0330regularex.php

0 意見:

張貼留言