歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> Linux教程

Linux基礎之grep和正則表達式

在使用系統時,我們或多或少的有一些搜索、查找的需求,必須要在文本中搜索某個關鍵字,或者過濾出文本中某些特定的行。grep 命令就為我們提供了這樣一個功能,同時,grep 還可以使用正則表達式進行匹配,這是一個強大的功能,有必要好好掌握。

  1.grep 初體驗

  grep PATTERN [OPTIONS] FILE:在文件中按照模式進行查找。FILE 是我們要查找的目標文件,如果不指定目標文件,grep 將會從標准輸入中讀取輸入的內容,然後進行匹配。為了方便起見,本文的所有演示都在命令行中通過標准輸入進行。

  • grep PATTERN:最基本的用法,根據 PATTERN 進行查找

   如果沒有高亮顯示匹配到的內容,可以手動指定:grep --color PATTER 進行匹配,更可以使用命令別名,減少我們的輸入時間:alias grep="grep --color"。

  • grep PATTERN -i:忽略大小寫匹配
  • grep PATTERN -v:反轉輸出。匹配到的內容不輸出,只輸出沒被匹配到的內容。

  • grep PATTERN -o:只顯示匹配到的字串(PATTERN)。默認顯示匹配到的字串所在的整行文本。

  2.grep 和正則表達式

  正則表達式(Regular Expression 或 REGEXP)分為基礎正則表達式(Basic REGEXP)和擴展正則表達式(Extended REGEXP)。grep 默認采用基礎正則表達式,如需使用擴展正則表達式需要附加選項。  

  由於介紹正則表達式實在太過復雜,我想了很久也無法很好的組織語言,因此這裡就不再對正則中的元字符進行一一的介紹了。需要了解這方面的同學,可以去看一下三十分鐘入門正則表達式系列的教程,應該很快就能學會。

  • 使用 grep 進行簡單的正則匹配

  "[]" 表示匹配 [] 中出現的任意一個字符,[a-zA-Z] 表示匹配所有的英文字母。

  "[^]" 表示匹配出去 [] 中出現的字符之外的任意字符。

  

  在正則表達式中,'*' 號不再表示任意字符,而表示其前的字符可以出現任意次。有時候我們在命令中使用 '*' 進行通配符匹配文件,要注意它在正則表達式中的不同用法。在正則表示中使用 '.' 點號來匹配任意字符。

  在正則中,'.' 點號表示不為空的任意字符。 

 ".*" 表示匹配出現任意次數的任意字符。正則表達式默認處於貪婪模式,因此在第一次匹配到結果後,還會進行多次匹配,知道沒有匹配為止。

  "\?" 表示匹配前面的字符出現 0 次 或者 1 次,注意這個問號需要被轉義。

  

  "\{m,n\}" 表示前面的字符出現最少 m 次,最大 n 次。"\{m,\}" 表示前面的字符至少出現 m 次,"\{,n\}" 表示前面的字符至多出現 n 次。

  

  '^' 和 '$' 是正則表達式中的兩個位置錨定。'^' 表示其後的字符必須出現在行首,而 '$' 表示其前的字符必須出現在行尾,"^$" 表示匹配空白字符。

   "\<" 和 "\>" 用來錨定單詞,二者不一定要成對出現,也可以使用 "\b" 進行錨定。"\bWORD" (或者 "\<WORD\>") 表示匹配以 WORD 開頭的單詞,"WORD\b" 表示匹配以 WORD 結尾的單詞,"\bWORD\b" 表示完完全全匹配 WORD 單詞。

  "\(\)" 表示對 PATTERN 進行分組,分組還支持後向引用,使用 "\1","\2" 等引用前面的分組。後向引用只匹配和前面相同的內容。

  '|' 表示或,匹配其前或者其後的單詞,注意並不是匹配字符,如需匹配字符,需要使用分組進行限定。我這裡使用的是擴展正則,如需使用基本正則,需要將 '|' 換為 "\|"。

  3.擴展正則表達式

   grep 同時還支持擴展正則表達式,在使用擴展正則表達式是,需要使用 -E 選項。基礎正則表達式和擴展正則表達式中的一些區別:

  • 基礎正則中使用 \?,擴展正則中使用 ?
  • 基礎正則中使用 \(\),擴展正則中使用 ()
  • 基礎正則中使用 \{\},擴展正則中使用 {}

  在基礎正則表達式中匹配 ?,(),{} ,不需要進行轉移,而在擴展正則表達式中則需要加上轉義符號 \。

  擴展正則表達式中的其他選項:

  • \s:匹配空白字符
  • \S:匹配非空白字符
  • \w:匹配字母,數字,相當於 [0-9a-zA-Z]
  • \W:不匹配字母和數字,相當於 [^0-9a-zA-Z]

  4.grep 的其他選項

  • grep PATTERN FILE -A NUM:使用 grep 進行匹配之後,顯示匹配的行,同時向後顯示指定的行
  • grep PATTERN FILE -B NUM:和上面相反,向後顯示指定行
  • grep PATTERN FILE -C NUM:進行匹配之後,分別向前和向後顯示指定的行,相當於 -AB NUM
  • grep PATTERN FILE -c:顯示被匹配到的行數
  • grep PATTERN FILE -F:相當於 fgrep
  • grep PATTERN FILE -P:使用 Perl 風格的正則表達式
    • \d:匹配任意十進制數字,相當於 [0-9]
    • \D:匹配任意非數字字符,相當於 [^0-9]

  5.egrep 和 fgrep

  在使用 grep 時,如果想要開啟擴展正則表達式,需要指定 -E 選項,而 egrep 命令則是默認支持擴展正則表達式。因此在需要使用擴展正則表達式時推薦使用 egrep 代替 grep -E。

  fgrep 表示快速匹配,不支持正則表達式,沒有轉義的概念,會對 PATTERN 中的所有字符進行匹配。

  6.總結

  本篇我們介紹了 grep 命令和正則表達式的基本使用,grep 是 Linux 下的一個文本處理命令,配合正則表達式使用,其功能非常強大。grep 主要用來查找操作,如果想使用替換等更加強大的功能,就需要使用 sed 或者 awk 命令。grep,sed,awk 被稱為 Linux 下的三個文本處理殺器,等學到相應的章節再繼續介紹 :)

grep使用簡明及正則表達式 http://www.linuxidc.com/Linux/2013-08/88534.htm

正則表達式的用法 http://www.linuxidc.com/Linux/2013-03/81897.htm

正則表達式之零寬斷言 http://www.linuxidc.com/Linux/2013-03/81897.htm

Linux命令-文件文本操作grep  http://www.linuxidc.com/Linux/2015-12/126259.htm

grep正則表達式 http://www.linuxidc.com/Linux/2015-09/123035.htm

Linux中正則表達式與文件格式化處理命令(awk/grep/sed) http://www.linuxidc.com/Linux/2013-03/81018.htm

Copyright © Linux教程網 All Rights Reserved