天天看點

grep指令詳解

    grep是一款非常好用的文本查找工具它的全稱為global regular expression print(全局正規表達式列印)grep家族的成員有grepegrepfgrep。grep支援基本的正規表達式元字元而egrep是擴充的grep支援更多的正規表達式元字元fgrep是快速grep元字元在其中不起作用隻比對它們本身這個不常用。

   而grep是幹什麼用的呢它是一個文本查找工具它能在指定的一個或是多個檔案中查找到模式比對的指定的行然後經過處理把此行顯示出來原檔案不變。grep的模式是非常重要的它定義了查找條件。grep的模式可以用引号括起來或是不括(''表示強引用“”表示弱引用)但是如果模式中有空格的話就必須括起來模式之後的所有字元都視為檔案名。說到了模式不得不提的就是元字元了它使使用者能精确的指定要比對的模式。grep指令的使用格式為grep [options] pattern filename...

grep常用的元字元有

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

<code>  </code><code>^   行首錨定符</code>

<code>  </code><code>例grep --color=</code><code>auto</code> <code>"^root"</code> <code>/etc/passwd 比對passwd檔案中以root開頭的行 --color=</code><code>auto</code><code>不是一定要加加的話可以看出效果</code>

<code>  </code><code>$   行尾錨定符</code>

<code>  </code><code>例grep --color=</code><code>auto</code> <code>"bash$"</code> <code>/etc/passwd 比對passwd檔案中以bash結尾的行</code>

<code>      </code><code>grep --color=</code><code>auto</code> <code>"^root$"</code> <code>/etc/passwd 比對passwd檔案中以root開頭并且隻有root這個單詞的行</code>

<code>  </code><code>\&lt;  詞首錨定符</code>

<code>  </code><code>例grep --color=</code><code>auto</code> <code>"\&lt;ro"</code> <code>/etc/passwd 比對passwd檔案中以ro開頭的單詞</code>

<code>  </code><code>\&gt;  詞尾錨定符</code>

<code>  </code><code>例grep --color=</code><code>auto</code> <code>"sh\&gt;"</code> <code>/etc/passwd 比對passwd檔案中以sh結尾的單詞</code>

<code>      </code><code>grep --color=</code><code>auto</code> <code>"\&lt;root\&gt;"</code> <code>/etc/passwd 精确比對root這個單詞</code>

<code>  </code><code>.   比對任意單個字元某些特殊字元不比對如換行符</code>

<code>  </code><code>*   比對</code><code>"此前"</code><code>的任意字元0次或任意次</code>

<code>  </code><code>例  grep --color=</code><code>auto</code> <code>"r*"</code> <code>/etc/passwd 比對r字元後跟任意個r的字元的行</code>

<code>    </code><code>比對此前的字元0次或1次</code>

<code>  </code><code>\{m,n\} 比對此前的字元至少m次至多n次</code>

<code>  </code><code>\{m,\}  比對此前的字元至少m次</code>

<code>  </code><code>\{n\}   比對此前的字元n次</code>

<code>  </code><code>例grep --color=</code><code>auto</code> <code>"ro\{1,3\}"</code>  <code>/etc/passwd 比對ro并且後跟1或2或3個o的字元串</code>

<code>  </code><code>[]   比對指定範圍内的任意單個字元</code>

<code>  </code><code>[^]  比對指定範圍外的任意單個字元</code>

<code>  </code><code>例grep --color=</code><code>auto</code> <code>"r[a-z]ot"</code> <code>/etc/passwd 比對r并且後面試a-z中的任意單個字母再後為ot</code>

<code>  </code><code>\(\) \1 \2...  标記比對到的字元或字元串模式中用最多可以标記9個用\1,\2引用</code>

<code>  </code><code>grep --color=</code><code>auto</code> <code>"r\(o\)\1t"</code> <code>/etc/passwd 比對檔案中包含root的行</code>

grep的常用選項有

<code>--color=</code><code>auto</code> <code>對比對到字元加顔色</code>

<code>  </code><code>例:# grep --color=</code><code>auto</code> <code>"\&lt;root\&gt;"</code> <code>/etc/passwd 比對到有root這個單詞的行并且把root加顔色</code>

<code>  </code><code>-n   在比對的行前面顯示此行在檔案中的行号</code>

<code>  </code><code>-v   顯示比對不到的行</code>

<code>  </code><code>例:# grep --color=</code><code>auto</code> <code>"\&lt;root\&gt;"</code> <code>/etc/passwd 顯示沒有root的行</code>

<code>  </code><code>-i   比對字元時忽略大小寫</code>

<code>  </code><code>例:# grep --color=</code><code>auto</code> <code>-i </code><code>"rooT"</code> <code>/etc/passwd 即有root或rooT的行都比對</code>

<code>  </code><code>-r   在指定目錄下搜尋目錄中的多個檔案</code>

<code>  </code><code>例:# grep -r --color=</code><code>auto</code> <code>inittab /etc/ 比對etc目錄中所有檔案中有inittab的行</code>

<code>  </code><code>-B n 當比對某行之後把其之前的n行也顯示</code>

<code>  </code><code>-A n 當比對某行之後把其之後的n行也顯示</code>

<code>  </code><code>-C n 當比對某行之後把其之前之後的n行都顯示</code>

<code>  </code><code>例:# grep -C 2 --color=</code><code>auto</code> <code>root /etc/passwd 比對有root的行并把此行上下的2行也顯示出來</code>

<code>  </code><code>-o   隻顯示比對的字元串本身而非顯示整行。一行中有多個符合pattern的字元串都會顯示出來</code>

<code>  </code><code>例:# grep -o --color=</code><code>auto</code> <code>root /etc/passwd 比對root并且隻顯示比對到的内容root,以回車分割</code>

<code>    </code><code># head -n 1 1.txt |grep -o </code><code>' or '</code><code>|wc -l 統計1.txt的第一行有幾個or</code>

<code>  </code><code>-E   使用擴充的grep這樣grep -E 的功能和egrep就一樣了</code>

<code>  </code><code>-e   -e就是用來保護grep的選項的</code>

<code>  </code><code>例如1.txt中隻有</code><code>"-vb-"</code><code>這一行則grep --color=</code><code>auto</code> <code>“-vb-” 1.txt 比對的是b-也就是說grep把-v當成了他的選項了不比對。</code>

<code>而  grep --color=</code><code>auto</code> <code>-e “-vb-” 1.txt,比對的就是-vb-也就是說忽略了-v。</code>

<code>   </code><code>grep也常常用于腳本中因為grep指令的執行之後會有一個退出碼正确執行退出碼是0如果在檔案中沒有找到與模式比對的字元串退出碼為1如果根本沒有找到這個檔案退出碼為2這個在腳本中運用廣泛。</code>

<code>  </code><code>例grep </code><code>"root"</code> <code>/etc/passwd</code>

<code>      </code><code>echo </code><code>"$?"</code>  <code>會顯示上這個grep指令執行後的退出碼</code>

本文轉自 leejia1989 51CTO部落格,原文連結:http://blog.51cto.com/leejia/787155,如需轉載請自行聯系原作者