2008年8月12日 星期二

linux指令-grep & 正規表示式

find是針對檔名或是檔案的屬性去收尋,而locate是依資料庫內的所有檔案其絕對路徑中,有符合我們需要的關鍵字去收尋,等一下要介紹的是針對檔案的內容去做收尋,有點類似windows下的google desktop

[root@host ~]# grep [-acinvr] '搜尋字串' filename
參數說明:
-a :將 binary 檔案以 text 檔案的方式搜尋資料
-c :計算找到 '搜尋字串' 的次數
-i :忽略大小寫的不同,所以大小寫視為相同
-n :順便輸出行號
-v :反向選擇,亦即顯示出沒有 '搜尋字串' 內容的那一行!
-r :收尋指定目錄下的所有檔案,包含指定目錄下的目錄下的檔案,反正,就是目錄下的任何檔案啦~
[範例]:
[root@host ~]# grep 'root' /var/log/secure
將 /var/log/secure 這個檔案中有 root 的那一行秀出來

[root@host ~]# grep -v 'root' /var/log/secure
若該行沒有 root 才將資料秀出來到螢幕上!

[root@host ~]# last | grep root
若該行有 root 才將資料秀出來到螢幕上!


[情況]:我有一個程式檔案,newclass.h,但是,我不知道有哪一個檔案有include到它,因此,最笨的方法是我打開每一個檔案再去收尋是否有這一個關鍵字,因此,若有一百個檔案,我就要打開一百次,同樣的「作重覆的事情是罪惡的」,所以,我找到以下用法

[root@host ~]# grep -r newclass.h /root/newfile
以上是把/root/newfile目錄下的所有檔案的內容找過一遍,並且把有newclass.h的這一行顯示出來


正規表示式的說明請參考鳥哥的私房菜-正規表示法 Regular Expression, RE
本來我打算再跟著寫一遍,但是,其實,有很多東西鳥哥就寫的很好了,而且,很多東西其實目前沒有用到,這樣寫下去版面太亂了。

我只寫某一些我有機會會用到的

[root@host ~]# grep -n 't[ae]st' regular_express.txt
在regular_express.txt檔案中尋找有出現tast或是test的字串的行

[root@host ~]# grep -n '^[^a-zA-Z]' regular_express.txt
那個 ^ 符號,在字元集合符號(括號[])之內與之外是不同的! 在 [] 內代表『反向選擇』,在 [] 之外則代表定位在行首的意義!要分清楚喔!


'^'表示行首的特殊字元,而'$'表示行尾的特殊字元
'.'表示一個任意字元
'*'表示一個重複字元,重覆前一個字元0個或多個

[2009.04.15 補充]
今天意外發現grep一些不錯的參數,也是主要參考鳥哥的資料

$ grep [-A] [-B] [--color=auto] '搜尋字串' filename
選項與參數:
-A :後面可加數字,為 after 的意思,除了列出該行外,後續的 n 行也列出來;
-B :後面可加數字,為 befer 的意思,除了列出該行外,前面的 n 行也列出來;
--color=auto 可將正確的那個擷取資料列出顏色


其中為了避免每一次均要打上--color=auto
所以,可以在.bashrc上加上
alias grep='grep --color=always'
會是一個不錯的選擇喔~
例子:
$ grep an .bashrc --color=always -A1 -B2
會尋找內容為an的行,並且把前1行與後2行的資料也一同印出來

[2014.03.13 補充]
在使用grep指令的時候,也可以排除特定的目錄。
這樣可以節省一些時間,是蠻不錯的。


--include=FILE_PATTERN search only files that match FILE_PATTERN
--exclude=FILE_PATTERN skip files and directories matching FILE_PATTERN
--exclude-from=FILE skip files matching any file pattern from FILE
--exclude-dir=PATTERN directories that match PATTERN will be skipped.



$ grep -r CMD_JOBS_T . --exclude-dir=redirect

尋找當前目錄下的文字檔(包含字目錄)是否含有CMD_JOBS_T字串,而且在尋找的過程中,排除redirect資料夾。

[2014.03.18 補充]
尋找目前目錄下,所有*.h檔案,是否有include這一個字串

$ grep include *.h

原本想再加強,尋找目前目錄包含子目錄下的所有*.h檔案,
但是,發現沒有辦法完成,
目前是想透過find指令搭配grep來完成這個任務。

[2014.04.02 補充]
在一般預設的情況下,grep是會尋找檔案裡面有符合的字串。 例如,我使用下面指令 grep 'abc' sample.txt 則會找到 test abc test abcd 若我要尋找完全符合的字串,則要使用-w的參數, %> grep 'abc' -w sample.txt 參考資料:
grep 過濾.svn文件 如何使用grep精确匹配一个单词

1 則留言:

anny 提到...

謝謝你的資料整理!! 受益良多!!