grep指令使用簡集

查找目前目錄與子目錄下的檔案內含有text字串的檔案的位置
grep -r "text" ./ # r遞迴搜尋
grep -rn "text" ./ #n印出行號
grep -ri "text" ./ # i忽略大小寫
grep -c "prepared" # 統計指定檔案內搜尋該文字出現的次數,不印出該行內容
grep -rI "text" ./ # 忽略2進位檔
grep -rl "text" ./ # 只出含有text的檔案名, 一般是會用管線和檔案處理指令如cp, rm等一起使用


想要順便看grep內容的上下文, 可以用-A, -B或是 -C
-A {n} 是之後(after)的數行
-B {n}是之前(before)的數行
-C {n}是上下都印數行

如果文字檔案包含一些非字元的內容, grep就只會當作binary檔案印出match或不match, 如果想要grep視為文字檔處理, 就用-a。

-b是印出檔案的byte-offset

真的你是要看binary裡面的字串, 我會建議先用string 將binary檔案內的文字析出, 再接上grep 會比較恰當。



忽略無法讀取或不存在加上-s或是--no-messages

忽略.git目錄
grep --exclude-dir=".git" -r text_start ./

忽略搜尋二進位檔/執行檔
grep --exclude-dir=".git" -r text_start ./ -I

從前個指令的螢幕輸出來查找
例如: ps aux | grep "ps aux"


搜尋android logcat的logfile.txt中某個時間區段的log
awk '$0 > "08-08 11:35:30.000" && $0 < "08-08 11:38:35.322"' logfile.txt

搜尋MediaPlayerService的訊息並指定時間在08-08 11:35:30.000之後的log
grep "/MediaPlayerService" logfile.txt | awk '$0 > "08-08 11:35:30.000"'


如何搜尋字串包含.的
grep -rn "\.methodname" ./
如何搜尋字串包含->的
grep -rn "\->methodname" ./
-在grep的參數(option)處理有其他意義,需要用跳脫字元來處理,不然會寫說grep沒有某option
要搜尋的字串中若包含>, 如果沒有用雙引號刮起來, 會被bash認為是要輸出到methodname這個檔案, 然後很慘的式它會無窮的跑下去,
因為你輸出的檔案裡面會包含grep到的結果,然後它就無窮的grep下去

關於Grep的正規表示式的用法
句點(.)表示一個任意字元, 例如a.c可以找到 abc, adc, axc
星號(*)表示前面的pattern會出現任意次數, 例如abc*,如果找不到abc的也會出現
問號(?)表示前面的pattern至多出現一次, 也是找不到的也會出現
\{n,m\}表示前面的pattern出現次數介於n~m之間,例如:
grep -n 'go\{2,3\}g' regular_express.txt可以搜尋到goog和gooog

找2個位數以上的數字,下面這兩種寫法是一樣的
grep '[0-9][0-9][0-9]*' file1
grep '[0-9]\{2,\}' file1


有一個數字以上的行
grep '[0-9]\+' file1中括號([,])表符合內部括著的任何字元,例如[cm]an 可以找到man, can; [a-z]可以找英文小寫a-z任意行首用尖括號(^)表示,不過只有當pattern的第一個字時才有效,如果放在中括號裡面是表示不在列舉範圍內的任意字元的意思

行尾用錢字號($)表示, 不過只有當pattern的最後一個字時才有效(vim預設也是用這個符號)
[:alnum:] 數字及字母 => [a-zA-Z0-9]
[:alpha:] 字母 => [a-zA-Z]
[:blank:] 空白和tab
[:digit:] 數字
[:space:] 空白字元
[:upper:] / [:lower] 大/小寫字元
[:xdigit:] 十六進位數字[0-9a-fA-F]

用<>來把要搜尋自成一個單字,\<和\>
grep '\<[Ll]inux\>' file1 # 找出有獨立單字Linux或是linux的行,不會是GNULinux, LinuxOS之類的

用小括號()把要視為一個搜尋單位的包起來
grep '\(abcd\)\{2,\}' file會搜尋到abcdabcd, abcdabcdabcd, abcdabcdabcdabcd等等

如何使用多個條件

OR功能
搜尋指定檔案內的有advance或是AndroidVideoPlayer的行
grep 'advance\|AndroidVideoPlayer'
grep -E 'advance|AndroidVideoPlayer'
grep -e advance -e AndroidVideoPlayer
grep -E 可以直接改成egrep,意思是擴充版grep

搜尋指定檔案內有的一行內有pattern1且有pattern2的一種方法,缺點是如果要列印行數只能在第一個條件加參數-n
grep 'pattern1' filename | grep 'pattern2'

AND功能
grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename
NOT功能
grep -v pattern1
搜尋當前目錄下的Android.mk檔案,包含module名稱
find ./ -type f -name "Android.mk" -print0 | xargs -0 grep -E "LOCAL_MODULE.*module-name-you-want"

xargs加上-p可以察看每次丟給後面做的command,適合debug寫法

參考資料
http://stackoverflow.com/questions/22565450/grep-log-file-greater-than-time-stamp
http://linux.vbird.org/linux_basic/0330regularex.php#basic_regexp_char
http://www.thegeekstuff.com/2011/10/grep-or-and-not-operators
http://tille.garrels.be/training/bash/ch04s02.html
http://nelsonchunglife.blogspot.tw/2010/12/ab.html

留言