文本搜索之grep、fgrep、egrep以及正則表達式

一、grep、egrep、fgrep命令

  說明:本文在CentOS 6.6 X86_64系統下grep、egrep、fgrep命令和正則表達式的基本參數和使用格式、方法。

1.1、基本定義:

    grep(Global search Regular Expression ) and Print out the line,全面搜索正則表達式並把行打印出來)是一種強大的文本搜索工具,它只能使用基本的正則表達式來搜索文本,並把匹配的行打印出來。

    grep是很常見也很常用的命令,它的主要功能是進行字符串數據的比較,然後符合用戶需求的字符串打印出來,但是主意,grep在數據中查找一個字符串時,是以“整行”爲單位進行數據篩選的。

    egrep命令等同於grep -E,利用此命令可以使用擴展的正則表達式對文本進行搜索,並把符合用戶需求的字符串打印出來。

    fgrep命令等同於grep -F,它利用固定的字符串來對文本進行搜索,但不支持正則表達式的引用,所以此命令的執行速度也最快。

    正則表達式組成

    正則中的字符分爲元字符和一般字符,一般字符就匹配它本身(寫什麼就是什麼,比如正則中寫字母‘a’,匹配的時候就匹配字母‘a’),而元字符是正則表達式中最基本的內容,也是最核心的內容,基本上所有的正則表達式都由“元字符”組成,元字符就是正則表達式的基礎。在此文中,會涉及到字符組,多選結構,點號以及預定義字符集的基本介紹。

    正則表達式作用

    正則表達式在很多文本編輯器裏,正則表達式通常被用來檢索、替換那些符合某個模式的文本。簡而言之,正則表達式就是處理字符串的方法,以行爲單位進行字符串的處理,通過一些特殊符號的輔助,可以讓用戶輕鬆搜索/替換某特定的字符串。

    名稱解釋

    元字符:所謂元字符就是指那些在正則表達式中具有特殊意義的專用字符。這些元字符(專用的字符或則字符組),可以代替多個一個或多個字符。

    正則表達式:由一類字符書寫的模式,其中有些字符不表示字符的字面意義,而是表示控制或通配的功能。

1.2、命令基本用法:

    1.2.1、grep用法

    grep [OPTIONS] 'PATTERN' [FILE...]

    grep常用選項:

        -c :計算找到'搜索字符串'的次數

        -i :忽略大小寫 

        -v :反向查找,即顯示沒有'搜索字符串'內容的那行 

        -o :只顯示被模式匹配的字符串 

        -n :輸出行號 

        --colour(color):顏色顯示 

        -A:顯示匹配到字符那行的後面n行 

        -B:顯示匹配到字符那行的前面n行 

        -C:顯示匹配到字符那行的前後n行 

1.2.2、egrep用法:

    同grep用法,本處略。

1.2.3、fgrep用法:

    fgrep [OPTIONS] 'String' [FILE...]

    同grep用法,本處略。

1.2.4、grep的匹配選擇:

    grep -G, --basic-regexp:以標準正則表達式,進行匹配。

    grep -E, --extended-regexp:以擴展正則表達式,進行匹配。

    grep -F, --fixed-strings:以'字符串',進行匹配。

    grep -P, --perl-regexp:以Perl的正則表達式,進行匹配。

二、標準正則表達式

2.1、基本元字符:

    一般字符:匹配自身

        .:匹配任意除換行符"\n"外的字符。

        \:轉義字符,使後一個字符改變原來的意思。如果字符串中有字符*需要匹配,可以使用\*或字符集[*]

        [...]:字符集(字符類)。對應的位置可以是字符集中任意單個字符。字符集中的字符可以逐個列出,也可給出範圍。

        [^]:匹配指定集合外的任意單個字符

2.2、預定義字符集(可以寫在字符集[...]中)

        字符集合

            [:space:] 所有的空白字符, [[:space:]]

            [:punct:] 所有標點符號

            [:lower:] 所有小寫字母

            [:upper:] 所有大寫字母

            [:digit:] 所有數字

            [:alpha:] 所有字母

            [:alnum:] 所有字母和數字

2.3、數量詞

        *: 匹配其前面的字符任意次,0,1或多次;

        \?:匹配其前面的字符0次或1次;

        \+: 匹配其前面的字符出現至少1次;

        \{m\}: 匹配其前面的字符m次;

        \{m,n\}:匹配其前面的字符至少m次,至多n次;

        .*: 匹配任意長度的任意字符

2.4、字符錨定

        ^: 行首錨定

        寫在模式的最左側

        $: 行尾錨定

        寫在模式的最右側

        ^$: 空白行

        \<: 詞首錨定, \b

        出現在要查找的單詞模式的左側;\<char

        \>:詞尾錨定, \b

        出現在要查找的單詞模式的右側;char\>

        \<pattern\>: 匹配單詞

2.5、分組:

    \(\):被括起來的表達式將作爲分組,行表達式左邊開始每遇到一個分支的左括號'(',編號+1。

        後向引用:模式中,如果使用\(\)實現了分組,在某行文本的檢查中,如果\(\)的模式匹配到了某內容,此內容後面的模式中可以被引用;

        \1, \2, \3

        模式自左而右,引用第#個左括號以及與其匹配右括號之間的模式匹配到的內容;

三、擴展正則表達式

    字符匹配

        .:匹配任意除換行符"\n"外的字符。

        [...]:字符集(字符類)。對應的位置可以是字符集中任意單個字符。字符集中的字符可以逐個列出,也可給出範圍。

        [^]:匹配指定集合外的任意單個字符

    匹配次數限定

        *:匹配其前面的字符任意次,0,1或多次;

        ?: 匹配其前面字符0次或1次;

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

        {m}:匹配其前面的字符m次;

        {m,n}:匹配其前面的字符最少m次,最多n次;

        {m,}:匹配其前面的字符最少m次; 

        {0,n}:匹配其前面的字符0次,最多n次;

    錨定

        ^:行首錨定;

        $:行尾錨定;

        \<, \>: \b:匹配單詞

    分組

        (...):被括起來的表達式將作爲分組,行表達式左邊開始每遇到一個分支的左括號'(',編號+1。 

        支持後向引用:\1, \2, ...

    或者

        |:|代表左右表達式任意匹配一個。它總是先嚐試匹配左邊的表達式,一旦成功匹配則跳過匹配右邊的表達式。

四、例子演示:

4.1、grep基本用法:

     # grep -c 'HOSTNAME' /etc/rc.sysinit

     # grep -i 'HOSTNAME' /etc/rc.sysinit

    wKiom1RskMmwG6F4AAIddM0ef2Q389.jpg

    # cat human_info.txt 

    # grep -v 'allen' human_info.txt

    # grep -o 'alex' human_info.txt 

    # grep -n 'alex' human_info.txt 

    # grep -A 1 'alex' human_info.txt

    # grep -B 1 'alex' human_info.txt

    # grep -C 1 'alex' human_info.txt

    wKioL1RskUKxuoMPAAGpBXsRDxY820.jpg

4.2、基本正則表達式

cat demo_info.txt 

abc

abcabc

abc edf

a,b,c

123

ABC

abc123  

    ## 集合

    # grep '[[:space:]]' demo_info.txt

    # grep '[[:punct:]]' demo_info.txt

    # grep '[[:upper:]]' demo_info.txt

    # grep '[[:lower:]]' demo_info.txt

    # grep '[[:digit:]]' demo_info.txt

    wKioL1RslwuwMpHcAAFqJFmyQ80883.jpg

    ## 數量詞

    wKioL1Rso6qSF-SiAAGARMRmv00429.jpg

    ## 位置錨定 (單詞錨定)

    wKiom1RsqS-isCltAAGbPBOUU2Y923.jpg

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章