grep與正則表達式

1.什么是grep

grep(Golobal Regular Expression print)Linux系統中一個強大的文本搜索工具,也是俗稱的搜索三兄弟之一,grep的最大意義就是搜索文本,把匹配的行打印到屏幕上,但不影響原文件的內容;在搜索文本的過程中,可以利用到正則表達式來定以自己的搜索匹配模式。

Unixgrep家族包括了grepegrep、fgrep三個,接下來的內容也會圍繞著grep來進行展開;

2.grep家族的簡單用法

2.1常用用法

         grep的常用用法很簡單,通常使用如下的格式:

                   grep  [OPTIONS]  PATTERN  [FILES];

         PATTERN也就是搜索模式,是grep進行文本搜索過濾的條件,通常由正常字符及正則表達式的字符組成;

         相對于grep而言,egrep = grep -E 可以使用基本的正則表達外, 還可以用擴展表達式;fgrep=grep –F, 但是fgrepgrepegrep有一些明顯的區別,fgrep并不使用正則表達式,而會將PATTERN解釋為一般的字符來進行查找,從而fgrep在搜索不需要使用正則表達式的情況下速度是最快的;

2.2常見參數

Options

解釋

-o

只顯示被模式匹配到的內容

-i

搜索時不區分字符大小寫

-v

顯示不能夠被模式匹配到的行

-E

使用擴展的正則表達式,相當于使用egrep

-F

將范本樣式視為固定字符串的列表,相當于fgrep

-c

只顯示匹配行的數量

-n

在輸出前加上上匹配行的行號

–color=

auto, always,   never

-A #

顯示被模式匹配到的行及后#

-B #

顯示被模式匹配到的行及前#

-c #

顯示被模式匹配到的行及其前后各#

3.詳解grep的搜索

3.1通配符

         在搞搞grep的搜索用法,也就是使用正則表達式之前,我覺得自己還是很有必要來重新過一遍Linuxshell的通配符,來作為學習正則表達式之前的熱身和比較;目前最常用的文件通配符包括*、?[],具體如下:

解釋

示例

*

任意長度的任意字符,零個或多個;

heah*,head為首的任意長度的字符

*tail,tail為結尾的任意長度的字符

?

任意單個字符,可使用多次

y?u,?表示中間有且只亦一個字符

[]

匹配[]內任意單個字符

[0-9][abd]

[^]

不匹配[]內的任何字符

[^0-9]匹配0-9之外的任意字符

         注:這些字符都有這特殊含義,而要想使用其的一般含義,需加上轉義符”\”進行轉義;

3.2正則表達式

         想想還是覺得c一段正則的解釋放在這里比較好,不然我自己都說不出個所以然來。正則表達式(REGular Expression);簡稱REGEXP,是由元字符及正常字符所書寫的模式,其中有元字符不表示字符本身的意義,而是用于表達控制或通配等功能;而常用的正則表達式則分為了基礎正則表達式、擴展正則表達式,為了方便自己記憶,還是覺得整個丑的表格比較下:

         偷懶這里就按照馬哥教的來排個序;基礎和正則表達式最大的區別也就是在使用上,例如grep –E或者egrep才可以使用擴展正則表達式,以后在使用的過程中,也必須要了解命令是否支持擴展的正則表達式先;

 

類型

元字符

意義

基礎篇

擴展篇

字符匹配

.

.

匹配任意單個字符,相當于通配符?;

[]

[]

匹配指定范圍內的任意單個字符;

[^]

[^]

匹配指定范圍外的任意單個字符;

一些常用特殊的字符匹配,通用

[0-9] = [[:digit:]] = \d = [123456789]

匹配數字

[a-z] = [[:lower:]]

匹配單個小寫字母

[A-Z] = [[:upper:]]

匹配單個大寫字母

[0-9a-zA-Z] = [[:alnum:]]

匹配單子字母或數字

[a-zA-Z] = [[:alpha:]]

匹配單個字母,不區分大小寫

[[:space:]] = \s

匹配空白字符

[[:punct:]]

匹配單個標點符號

\w

匹配字母或數字或下劃線或漢字

注:可使用[^]表示范圍外,[^[]]

 

類型

元字符

意義

基礎篇

擴展篇

次數匹配

(在期望匹配字符的后面提供一個控制符號,用于表達匹配前面的字符指定的次數)

*

*

匹配*前面的單個字符任意次,可以為0次;

.*

.*

匹配任意長度的任意字符;

\?

?

匹配?前面的字符0或者1次;

\+

+

匹配+前面的字符至少1次;

\{m,n\}

{m,n}

匹配其左側的字符至少m次,至多n次;

\{m,\}

{m,}

匹配其左側的字符至少m次,無上限;

\{0,n\}

{0,n}

匹配其左側的字符至多n次;

\{m\}

{m}

精確匹配其左側的字符m次;

 

類型

元字符

意義

基礎篇

擴展篇

位置錨定

^

^

錨定行首,^PATTERN

$

$

錨定行尾,PATTERN$;

^PATTERN$

^PATTERN$

用模式匹配整行內容;

^$

^$

^[[:space:]]$,匹配空白行;

類型

元字符

意義

基礎篇

擴展篇

單詞錨定

\<

\<

錨定詞首,\<PATTERN =   \bPATTERN

\>

\>

錨定詞尾, PATTERN\>   = PATTERN\b

\<PATTERN\>

\<PATTERN\>

匹配PATTERN能匹配到的整個單詞;

\b

\b

匹配一個字邊界,即字與空格間的位置;

 

類型

元字符

意義

基礎篇

擴展篇

分組及引用

\(\)

()

()中字符集合到一起作為一個字符引用;

\#

\#

引用,模式中自左而右,

分組中的模式,在某次的具體匹配過程中所匹配的字符,可以被grep記憶(保存在內置的變量中,這些變量是\1, \2,…,因此,還可以被引用;

         還是要注:這些字符都有這特殊含義,而要想使用其的一般含義,需加上轉義符”\”進行轉義;

 

摘一段正則表達式的貪婪與非貪婪模式:

1.什么是正則表達式的貪婪與非貪婪匹配

  如:String str="abcaxc";

    Patter p="ab*c";

  貪婪匹配:正則表達式一般趨向于最大長度匹配,也就是所謂的貪婪匹配。如上面使用模式p匹配字符串str,結果就是匹配到:abcaxc(ab*c)。

非貪婪匹配:就是匹配到結果就好,就少的匹配字符。如上面使用模式p匹配字符串str,結果就是匹配到:abc(ab*c)。

默認是貪婪模式;在量詞后面直接加上一個問號?就是非貪婪模式。

        

正則表達式還有很多,鑒于我初學的能力,慢慢來總結,記錄下幾個例子來幫自己回顧下:

1、找出/etc/passwd文件中的一位數或兩位數:

1.png

2、找出當前系統上用戶名與默認shell相同的用戶:

[root@Exercises ~]# grep "^\(\<[[:alnum:]]\+\>\).*\1$" /etc/passwd

2.png

 

3、使用echo命令輸出一個路徑,使用grep實現basename的功能:

[root@Exercises ~]# echo "/etc/passwd/" |grep -o "[[:alnum:]]\+\/\?$" |cut -d/ -f1

passwd

4、執行ifconfig然后輸出當前系統的ip

[root@Exercises ~]# ifconfig | grep -E "\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-3][0-9])\>(\.\<([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\>){3}"

          inet addr:192.168.1.111  Bcast:192.168.1.255  Mask:255.255.255.0

          inet addr:192.168.88.20  Bcast:192.168.88.255  Mask:255.255.255.0

 

第一篇,很不完善,還是要繼續總結,還是要堅持~

同時,求指正,求指正!謝謝~

 

原創文章,作者:AZ,如若轉載,請注明出處:http://www.www58058.com/8686

(0)
AZAZ
上一篇 2015-10-07
下一篇 2015-10-08

相關推薦

  • Linux的安全控制訪問模塊之SElinux

    SElinux   1、Selinux介紹:Linux的一個強制訪問控制安全模塊,2000年以GNU GPL發布,Linux內核2.6版本集成在內核中。 DAC:自由訪問控制,進程是無束縛的。 MAC:強制訪問控制,策略的規則決定控制的嚴格程度(策略被用來定義被限制的進程能夠使用那些資源[文件和端口]);進程的可以被限制的;默認情況下,沒有允許的行…

    Linux干貨 2016-09-19
  • 第二周作業

    一、文件管理類命令     1、cp:復制文件        單文件復制cp source dest,如果dest存在且dest不是目錄,則覆蓋目標文件。如果dest不存在,則自行創建dest文件;如果source是目錄,則cp命令不會執行。如果source是鏈接文件,則復制的是鏈接文件指向的文件內…

    Linux干貨 2016-12-11
  • DNS基礎知識

    一、DNS介紹:   1、DNS: Domain  Name Service,域名解析服務;      部署方式為分布式部署,如圖所示:        2、查詢類型:     遞歸查詢:僅發出一次請求,要求對方回復最終結果&nbs…

    Linux干貨 2015-05-18
  • N22-第四周作業

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。 ~]# cp -r /etc/skel /home/tuser1 ~]# chmod -R go= /home/tuser1/ 2、編輯/etc…

    Linux干貨 2016-09-06
  • 三次握手,四次揮手

    TCP/IP協議的詳細信息參看《TCP/IP協議詳解》三卷本。 在談及TCP建立連接和釋放連接過程,先來簡單認識一下TCP報文段首部格式的的幾個名詞(這里只是簡單說明,具體請查看相關教程)下面是TCP報文格式圖:     序列號seq:占4個字節,用來標記數據段的順序,TCP把連接中發送的所有數據字節都編上一個序號,第一個字節的…

    2017-09-03
  • Linux – 計算機基礎知識體系

    一、認識計算機的組成      計算機組成(computer composition)指的是系統結構的邏輯實現,包括機器機內的數據流和控制流的組成及邏輯設計等。 計算機一般是由硬件系統和軟件系統這兩部分組成,硬件系統包括:CPU、內存、硬盤、輸入和輸出設備(鍵盤鼠標、顯示器等),軟件系統包括:系統軟件自身、用…

    Linux干貨 2017-02-19
欧美性久久久久