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
沒有留言:
張貼留言