標籤:shell grep
當我們需要在成千上萬個檔案中找到一個指定的檔案,可能我們可以用ls filename . 結果會列出這個檔案的一些資訊.但這不是最好的方式.或者指定規則的檔案的時候,ls顯然無法滿足我們的需求了.無論上述哪種情況,我們需要一個強大的助手-grep.
grep還有幾個變體,分別是egrep, fgrep, rgrep. 在這幾個變體裡面,我只知道egrep是grep -E .也就是grep的正則變體.
grep [option] "pattern" [filename]
此處之所以把檔案名稱用中括弧括起來,是因為檔案名稱可有可無.grep可以從標準輸入擷取資料.
option可選的選項有很多.因為選項太多了,man手冊還特意的給這些選項做了一個分類.看看是啥:
1. 匹配方式選擇
-E 正則匹配
其它的都沒有用過.
2. 匹配控制
-i 忽略大小寫
-e 可以指定多個pattern
-f 指定pattern檔案,也就是說,可以把要尋找的欄位放在一個檔案中,當指定多個pattern的時候,這個比較常用.
-v 反向尋找.即列出不匹配的.
3. 基本輸出控制
-c 列印匹配行數,不是次數
--color=... 一般這個值就是auto.指定輸出的顏色
-L 列印不匹配的檔案
-l 列印匹配的檔案
-o 僅列印匹配的pattern
-q 靜默模式,需要通過$? 來檢查返回值來確定是否找到匹配的內容
4. 輸出行修飾
-b 列印首字母位移,注意這個便宜不是匹配字元的位移,如果要列印匹配字元的位移需要配合-o選項
-h/H 前者不帶檔案名稱列印,後者帶檔案名稱列印.預設列印檔案名
-n 列印檔案的第幾行匹配了pattern
-Z 有的時候,一個檔案是使用空格作為分隔字元的,而空格是作為shell環境的IFS存在的,所以就有可能出現把一個檔案名稱分割成兩個檔案名稱的現象.面對這種問題,處理辦法是-Z,指定以\0作為字串的分隔字元.
5. 檔案和檔案夾的選擇
-a 把所有檔案都當做是文字檔來處理
--exclude=... 去除指定的檔案
--exclude-from=FILE FILE中列出需要忽視的檔案名稱.
--exlucde-dir=... 忽略掉指定的檔案夾
ok吧,就這些吧.光記住這些就已經很頭疼了.反正我差不多都記住了.
另外還有三個比較好玩的選項-A -B -C . 意思分別是,列印匹配前幾行,列印匹配後幾行,列印匹配前後各幾行.-A等後面接一個數字.
下面還是看看grep的一些用法吧.
過濾當前檔案夾下sh為尾碼的檔案,然後過濾sh檔案中的expect檔案.並且打出其前後兩行.然後測試-o和-b選項.
找到目前的目錄下,包含bash字串的檔案.有好多is a directory,消除它.
只列印匹配的檔案名稱,然後列印不匹配的檔案名稱,然後再看看-H/h的效果.列印出匹配的資訊在第幾行
全目錄搜尋排除某個目錄下的所有檔案.這裡不知道是不是bug的原因.列出我兩次命令的區別.
兩次輸入的區別就是一個帶了/一個沒有帶.結果就不一樣.看來以後這個要記住了,收穫啊.
Regex就不再去介紹了,完全可以寫好幾篇文章介紹.網上也有很多資源.同學們可以去參考一下.(其實我也是個Regex的二把刀)
ok.就介紹這麼多吧.每次用grep的時候都感覺知道的好少,突然一總結髮現,知道的也不少啊.其實關鍵還是在運用上面,shell編程就是這樣,可能有些命令我們並不知道,但是可以根據我們知道的命令去完成.
9 shell命令之grep