grep、egrep命令及正則表達式

grep系:

grep:Global search Regular Expression and Print out the line。

利用正則表達式進行全局搜索並將匹配到的行顯示出來;



格式:

grep [OPTIONS] PATTERN [FILE...]

        grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]


        PATTERN:過濾匹配條件,是由沒有特殊意義的文本字符或者是正則表達式元字符構成;


grep: 僅支持基本正則表達式元字符

egrep:可以支持擴展正則表達式元字符

fgrep:不支持任何形式的正則表達式元字符,將所有的字符都視爲沒有特殊意義的普通文本字符;


其中正則表達式與擴展正則表達式主要區別在於,正則表達式有的需要將反斜線寫出來,而擴展正則表達式則不需要。



正則表達式的元字符:

基本的正則表達式元字符:BRE

    字符匹配類:

    ".":匹配任意的單個字符;

[root@localhost ~]# grep "a.b" a.txt
aaaaaabbbabcabccccc
abcabcabcbcacbaaaaa

(匹配a和b中間跟上任意字符的行,結果分別爲abc,以及acb)



    "[]":匹配任意指定範圍內的單個字符;

[root@localhost ~]# grep "[a]" a.txt
aaaaaabbbabcabccccc
abcabcabcbcacbaaaaa

(匹配只有a的行)


    [^]:匹配任意指定範圍以外的單個字符;

[root@localhost ~]# grep "[^abc]" a.txt
ddddddddddddddddddk
ccccccccccccccccccl

(匹配除了字母abc以外的字符存在的行,結果是d,k以及l)



    下列所有的字符集都可以放置於[]之中,用於匹配字符集範圍內的單個字符;

  1、[:lower:]:所有的小寫字母

 [root@localhost ~]# grep "[[:lower:]]" a.txt
aaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbb

(匹配所有小寫字母存在的行)




2、[:upper:]:所有的大寫字母


[root@localhost ~]# grep "[[:upper:]]" a.txt
DDDDDDDDDDDDDCCCCCC
AAACACABCAAABCAAAAA

(匹配所有大寫字母存在的行)


3、[:alpha:]:所有字母,大小寫字母;


[root@localhost ~]# grep "[[:alpha:]]" a.txt
DDDDDDDDDDDDDCCCCCC
AAACACABCAAABCAAAAA
aaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbb

(匹配所有大小字母存在的行)



4、[:digit:]:所有單個的十進制數字;

[root@localhost ~]# grep "[[:digit:]]" a.txt
ccccccccccccccc2222

(匹配單個十進制數字存在的行)




5、[:alnum:]:所有的字母和十進制數字;


[root@localhost ~]# grep "[[:alnum:]]" a.txt
DDDDDDDDDDDDDCCCCCC
AAACACABCAAABCAAAAA
aaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbb
ccccccccccccccc2222

(匹配所有的字母和十進制數字)




6、[:punct:]:所有的符號


[root@localhost ~]# grep "[[:punct:]]" a.txt
$######@@@#$$$##@@#
&*(^())(_(&%!@#$$^*

(匹配所有符號存在的行)



7、[:space:]:表示空白字符,包括空格和製表符;


[root@localhost ~]# grep "[[:space:]]" a.txt |wc -l
3

(匹配空白字符存在的行,在此文件中有三行)



    8、[a-z]:只表示所有的小寫字母;

               [root@localhost ~]# grep "[a-z]" a.txt         
               aaaaaaaaaaaaaaaaaa
               bbbbbbbbbbbbbbbbbbb
               ccccccccccccccc2222

(匹配所有小寫字母存在的行)


    9、[A-Z]:只表示所有的大寫字母;

[root@localhost ~]# grep "[A-Z]" a.txt                             
DDDDDDDDDDDDDCCCCC
AAACACABCAAABCAAAAA

(匹配所有大寫字母存在的行)


    10、[0-9]:僅表示所有的十進制數碼;

[root@localhost ~]# grep "[0-9]" a.txt 
ccccccccccccccc2222

(匹配所有小寫字母存在的行)





    次數匹配類:該類字符前面的一個字符可以出現的次數;

    1、*:其前面的字符可以出現任意次,即:0次,1次或多次;

[root@localhost ~]# grep "AAA*" a.txt  
AAACACABCAAABCAAAAA

(匹配有AAA的行)



    2、\?:其前面的字符可有可無,即:0次或1次;

    [root@localhost ~]# echo /etc/passwd | grep -o "[^/]*/\?$"
    passwd

    (輸出某個路徑的基名)



    3、\{m,n\}:其前面的字符至少出現m次,最多不超過n次;

[root@localhost ~]# grep "A\{2,5\}" a.txt  
AAACACABCAAABCAAAAA

(匹配打A的行中,A至少出現2次,不能超過5次)



    4、\{m\}:其前面的字符必須出現m次;

[root@localhost ~]# grep "A\{5\}" a.txt  
AAACACABCAAABCAAAAA

(匹配打的A在本行中必須出現5次,匹配結果是最後的AAAAA)


    5、\{m,\}:其前面的字符至少出現m次;

    [root@localhost ~]# grep "A\{1,\}" a.txt  
AAACACABCAAABCAAAAA

(匹配到的A至少出現1次,即結果中的A全部匹配到)


    6、\{,n\}:其前面的字符至少出現0次,最多不超過n次;

[root@localhost ~]# grep "a\{,1\}" b.txt  
aabaaabacccvv
ababababababa
cccccccccccca

(匹配到的a至少出現0次,最多不超過1

次)



    7、注意:在正則表達式中,表示任意長度的任意字符:".*"

    
[root@localhost ~]# grep "^[[:space:]].*" /etc/grub2.cfg

    (找出/etc/grub2.cfg以空白字符開頭的非空白行;)


    位置錨定字符:

    行錨定:

    行首錨定:^

    行尾錨定:$

    [root@localhost ~]# grep "^[[:space:]]*$" /etc/grub2.cfg | wc -l
    17

    空白行數


    字錨定

    字首錨定:\<或\b

    字尾錨定:\>或\b


   

[root@localhost ~]# ifconfig | grep "\<[0-9]\>\|\<[1-9][0-9]\>"

找出一位數或者兩位數


   


    分組與前向引用字符:

    \(\):將()中包含的內容作爲一個不可分割的整體來處理;

    \1,\2,\3...:前向引用字符,

    是正則表達式處理引擎的內置變量,\1表示前面所出現的第一組小括號中所闊擴選的內容;\2表示前面所出現的第二組小括號中擴選的內容;...

    \(string1\(string2\)\): \1表示string1,\2表示string2

    \(string1\).*\(string2\): \1表示string1,\2表示string2

[root@localhost ~]# grep "^\(root\).*\1" /etc/passwd
root:x:0:0:root:/root:/bin/bash


或者:

\|:將其左右的字符或字符串當做整體來對待;

"C\|cat" C cat


[root@localhost ~]# ifconfig | grep "\<[0-9]\>\|\<[1-9][0-9]\>"

(找出ifconfig中一位數或者兩位數)




擴展的正則表達式元字符:ERE

        字符匹配類:

            1、".":匹配任意的單個字符;

            [root@localhost ~]# egrep "a.b" a.txt
            aaaaaabbbabcabccccc
            abcabcabcbcacbaaaaa

            (匹配a和b中間跟上任意字符的行,結果分別爲abc,以及acb)



           2、 "[]":匹配任意指定範圍內的單個字符;

            [root@localhost ~]# egrep "[a]" a.txt
            aaaaaabbbabcabccccc
            abcabcabcbcacbaaaaa

            (匹配只有a的行)


            3、[^]:匹配任意指定範圍以外的單個字符;

            [root@localhost ~]# egrep "[^abc]" a.txt
            ddddddddddddddddddk
            ccccccccccccccccccl

            (匹配除了字母abc以外的字符存在的行,結果是d,k以及l)



            下列所有的字符集都可以放置於[]之中,用於匹配字符集範圍內的單個字符;

                1、[:lower:]:所有的小寫字母

                [root@localhost ~]# egrep "[[:lower:]]" a.txt
                aaaaaaaaaaaaaaaaaaa
                bbbbbbbbbbbbbbbbbbb

                (匹配所有小寫字母存在的行)




                2、[:upper:]:所有的大寫字母

                [root@localhost ~]# egrep "[[:upper:]]" a.txt
                DDDDDDDDDDDDDCCCCCC
                AAACACABCAAABCAAAAA

                (匹配所有大寫字母存在的行)


                3、[:alpha:]:所有字母,大小寫字母;

                [root@localhost ~]# egrep "[[:alpha:]]" a.txt
                DDDDDDDDDDDDDCCCCCC
                AAACACABCAAABCAAAAA
                aaaaaaaaaaaaaaaaaaa
                bbbbbbbbbbbbbbbbbbb

                (匹配所有大小字母存在的行)



                4、[:digit:]:所有單個的十進制數字;

                [root@localhost ~]# egrep "[[:digit:]]" a.txt
                ccccccccccccccc2222

                (匹配單個十進制數字存在的行)




                5、[:alnum:]:所有的字母和十進制數字;

                [root@localhost ~]# egrep "[[:alnum:]]" a.txt
                DDDDDDDDDDDDDCCCCCC
                AAACACABCAAABCAAAAA
                aaaaaaaaaaaaaaaaaaa
                bbbbbbbbbbbbbbbbbbb
                ccccccccccccccc2222

                (匹配所有的字母和十進制數字)




                6、[:punct:]:所有的符號

                [root@localhost ~]# egrep "[[:punct:]]" a.txt
                $######@@@#$$$##@@#
                &*(^())(_(&%!@#$$^*

                (匹配所有符號存在的行)



                7、[:space:]:表示空白字符,包括空格和製表符;

                [root@localhost ~]# egrep "[[:space:]]" a.txt |wc -l
                3

                (匹配空白字符存在的行,在此文件中有三行)



                8、[a-z]:只表示所有的小寫字母;

                [root@localhost ~]# egrep "[a-z]" a.txt 
                aaaaaaaaaaaaaaaaaaa
                bbbbbbbbbbbbbbbbbbb
                ccccccccccccccc2222

                (匹配所有小寫字母存在的行)


                9、[A-Z]:只表示所有的大寫字母;

                [root@localhost ~]# egrep "[A-Z]" a.txt 
                DDDDDDDDDDDDDCCCCCC
                AAACACABCAAABCAAAAA

                (匹配所有大寫字母存在的行)


                10、[0-9]:僅表示所有的十進制數碼;

                [root@localhost ~]# egrep "[0-9]" a.txt 
                ccccccccccccccc2222

                (匹配所有小寫字母存在的行)





        次數匹配類:該類字符前面的一個字符可以出現的次數;

            1、*:其前面的字符可以出現任意次,即:0次,1次或多次;

            [root@localhost ~]# egrep "AAA*" a.txt  
            AAACACABCAAABCAAAAA

            (匹配有AAA的行)



            2、?:其前面的字符可有可無,即:0次或1次;

            [root@localhost ~]# echo /etc/passwd | egrep -o "[^/]*/?$"
            passwd

            (輸出某個路徑的基名)



            3、{m,n}:其前面的字符至少出現m次,最多不超過n次;


 

          [root@localhost ~]# egrep "A{2,5}" a.txt  
            AAACACABCAAABCAAAAA

            (匹配打A的行中,A至少出現2次,不能超過5次)



            4、{m}:其前面的字符必須出現m次;

            [root@localhost ~]# egrep "A{5}" a.txt  
            AAACACABCAAABCAAAAA

            (匹配打的A在本行中必須出現5次,匹配結果是最後的AAAAA)


            5、{m,}:其前面的字符至少出現m次;

            [root@localhost ~]# egrep "A{1,}" a.txt  
            AAACACABCAAABCAAAAA

            (匹配到的A至少出現1次,即結果中的A全部匹配到)


            6、{,n}:其前面的字符至少出現0次,最多不超過n次;

            [root@localhost ~]# egrep "a{,1}" b.txt  
            aabaaabacccvv
            ababababababa
            cccccccccccca

            (匹配到的a至少出現0次,最多不超過1

            次)



            7、注意:在正則表達式中,表示任意長度的任意字符:".*"

            [root@localhost ~]# grep "^[[:space:]].*" /etc/grub2.cfg

            (找出/etc/grub2.cfg以空白字符開頭的非空白行;)


        位置錨定字符:

            行錨定:

                行首錨定:^

                行尾錨定:$

                [root@localhost ~]# egrep "^[[:space:]]*$" /etc/grub2.cfg | wc -l
                17

               (匹配/etc/grub2.cfg空白行數)


            字錨定

                字首錨定:\<或\b

                字尾錨定:\>或\b


               

 [root@localhost ~]# ifconfig | egrep "\<[0-9]\>|\<[1-9][0-9]\>"

                (找出ifconfig一位數或者兩位數)


                


        分組與前向引用字符:

            ():將()中包含的內容作爲一個不可分割的整體來處理;

            \1,\2,\3...:前向引用字符,

                是正則表達式處理引擎的內置變量,\1表示前面所出現的第一組小括號中所闊擴選的內容;\2表示前面所出現的第二組小括號中擴選的內容;...                

                [root@localhost ~]# grep "^(root).*\1" /etc/passwd
                root:x:0:0:root:/root:/bin/bash


            或者:

                |:將其左右的字符或字符串當做整體來對待;

                "C|cat" C cat


 

     [root@localhost ~]# ifconfig | grep "\<[0-9]\>|\<[1-9][0-9]\>"

                (找出ifconfig中一位數或者兩位數)



grep系中常用命令:

1、-A num:同時顯示被PATTERN匹配到的行及其後續num行;


[root@localhost ~]# grep -A 2 "^root" /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin


2、-B num:同時顯示被PATTERN匹配到的行及其前面num行;

[root@localhost ~]# grep -B 2 "^xwl" /etc/passwd
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
tcpdump:x:72:72::/:/sbin/nologin
xwl:x:1000:1000:XWL:/home/xwl:/bin/bash

3、-C num:同時顯示被PATTERN匹配到的行及其前後num行;

[root@localhost ~]# grep -C 2 "^sshd" /etc/passwd
gdm:x:42:42::/var/lib/gdm:/sbin/nologin
gnome-initial-setup:x:988:983::/run/gnome-initial-setup/:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin



4、--color[=WHEN]:以高亮顏色表示被匹配到的內容;


[root@localhost ~]#  grep --color=auto '^sshd' /etc/passwd
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

(sshd爲加上顏色的)



5、-c,--count:不輸出被PATTERN匹配的行的內容,而是輸出被PATTERN匹配到的行數;

[root@localhost ~]# grep  -c "^[[:space:]]*$" /etc/grub2.cfg 
17

6、-E:可以使GREP命令支持擴展正則表達式元字符;相當於egrep命令;

[root@localhost ~]# ifconfig | grep  -E "\<[0-9]\>|\<[1-9][0-9]\>"


7、-F:--fixed-string:相當於fgrep;



8、-e PATTERN, --regexp=PATTERN:指定多個模式PATTERN在一個命令行中生效;

[root@localhost ~]# grep -e "AAA*" -e "aaa*" a.txt 
AAACACABCAAABCAAAAC
aaaaaaaaaaaaaaaaaaa


9、-f FILE, --file=FILE:從指定的文件中讀取多個PATTERN用於一次搜索;

[root@localhost ~]# cat a.txt | grep -f b.sh
$######@@@#$$$##@@#
&*(^())(_(&%!@#$$^*

(從其中找出相同的字符進行匹配)



10、-i, --ignore-case:忽略文件中的字符的大小寫;

[root@localhost ~]# grep -i "[[:upper:]]" a.txt 
DDDDDDDDDDDDDCCCCCC
AAACACABCAAABCAAAAC
aaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbb
ccccccccccccccc2222

(-i忽略大小寫,本來是匹配大寫字母,最後連小寫字母也一起匹配上)



11、-o, --only-matching:僅顯示被PATTERN匹配到的部分;關閉了貪婪模式;

(取得字符串很有用)

[root@localhost ~]# echo /etc/passwd | grep -o "[^/]*/\?$"
[root@localhost ~]# passwd

(取出/etc/passwd路徑中的基名)

    12、-q, --quiet, --silent:安靜模式;沒有輸出結果;相當於grep > /dev/null



13、-v, --invert-match:顯示沒有被PATTERN匹配到的行;

[root@localhost ~]# grep -v  "^[[:space:]]*$" /etc/grub2.cfg | wc -l
123




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