星期五, 5月 20, 2005

LINUX LPI 資格檢定讀書心得Part 2

1.7 使用正規表示式搜尋文字檔

globbing(使用萬用字符wildcard的行為)
操作可以同時列出或找出具有共同元素的檔案.但是若想將glob的概念延伸到任何一般的文字形式上就得靠正規表示式(regular expressions)的協助才行.

指令 grep
語法
grep [options] regex [files]

常用選項
-c 計算相符的列數
-h 顯示相符的每一列.但指定多檔時.不前置檔名
-i 忽略大小寫
-n 前置其列號
-v 顯示不相符的每一列

正規表示式內可以內含
中介字符(metacharacter)與字面字符(literal)
而且grep 可以只使用literal作為正規表示式

指令sed
語法
sed [options] 'command1' [files]
sed [options] -e 'command1' [-e 'command2'] [files]
sed [options] -f script [files]

正規表示式定義自數串文字或樣式(pattern). 而樣式是由中介字符(metacharacter)與字面字符(literal)所組成.所以當建構正規表示式時便可以使用中介字符(metacharacter)與字面字符(literal)對所要處理的輸入文字表達三個基本的意念:

1.位置定位符(Postition anchor)
用來指定一或多個字符位於整列文字的何處
2.字符集(Character set)
字符集可用來比對文字
3.數量修飾符(Quantity modifier)
代表與字符集的文字比對應該重複出現.讓正規表示式用有不定長度的文字比對能力

正規表示式的使用範例

定位符(anchor)

^ 比對一列之首
$ 比對一列之尾

範例1
顯示 file1檔中以 Linux 開頭的每一列文字

$grep '^Linux' file1

範例2
顯示file1檔中以 x 字符結尾的每一列文字

$grep 'x$' file1

群組與範圍

[abc] 符合a,b,或c的任一字符
[a-z] 符合範圍a到z的任一字符
[^abc] 非符合a,b,或c的任一字符
[^a-z] 非符合範圍a到z的任一字符
\ 比對單字
. 相符於newline以外的任一字符
\ 關閉其後所接字符的特殊意義

範例1
顯示 file1檔中包含 Linux 、 linux 的每一列文字
$grep '[Ll]inux' file1

範例2
顯示file1 包含連續三位數字的每一列
$grep '[0-9][0-9][0-9]' file1

範例3
顯示file1檔中任何非以一位數字起頭的每一列
$grep '^[^0-9]' file1

範例4
顯示file1檔中包含單字Linux或是linux (但不包含LinuxOS 或是 TurboLinux)的每一列
$grep '\<[Ll]inux\>' file1

範例5
顯示file1檔中包含五個或更多字符(newline字符不算在內)的每一列
$grep '.....' file1

範例6
顯示file1檔中包含一個句點(原是中介字符.但是使用倒斜線避開它的特殊意義)的每一列
$grep '\.' file1

修飾符

* 用來表示它之前的單一字符可能重現零次或多次
? 用來表示它之前的正規表示式可能重現零次或一次.屬延伸功能需使用-E才有作用
+ 用來表示它之前的正規表示式可能重現一次或多次.屬延伸功能需使用-E才有作用
\{n,m\} 用來表示它之前的單一字符可能重現的次數範圍
| 交替比對.可比對| 之前或是之後的正規表示式.屬延伸功能需使用-E才有作用

範例1
顯示file1檔中包含ab abc abcc 或是abccc等等的每一列
$grep 'abc*' file1

範例2
顯示file1檔中包含ab abc abcc 或是abccc(但是不包含ab)等等的每一列
$grep 'abcc*' file1

範例3
顯示file1檔中包含連續兩位或多位數字的每一列
$grep '[0-9][0-9][0-9]*' file1

範例4
顯示file1檔中包含file,file1,或是file2字樣的每一列
$grep -E 'file[12]?' file1

範例5
顯示file1檔中至少包含一位數字的每一列
$grep -E '[0-9]+' file1

範例6
顯示flie1檔中只包含111,1111,或是11111的每一列
$grep '^1\{3,5\}$' file1

範例7
顯示file1檔中包含3位4位或是5位數字的每一列
$grep '\<[0-9]\{3,5\}\>' file1

範例8
顯示file1檔中包含Happy,happy,Sad,sad,Angry,angry的每一列
$grep -E '[Hh]appy|[Ss]ad|[Aa]ngry' file1

沒有留言: