grepegrep命令及正则表达式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了grepegrep命令及正则表达式相关的知识,希望对你有一定的参考价值。

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

    字符匹配类:

    ".":匹配任意的单个字符;

[[email protected] ~]# grep "a.b" a.txt
aaaaaabbbabcabccccc
abcabcabcbcacbaaaaa

(匹配a和b中间跟上任意字符的行,结果分别为abc,以及acb)



    "[]":匹配任意指定范围内的单个字符;

[[email protected] ~]# grep "[a]" a.txt
aaaaaabbbabcabccccc
abcabcabcbcacbaaaaa

(匹配只有a的行)


    [^]:匹配任意指定范围以外的单个字符;

[[email protected] ~]# grep "[^abc]" a.txt
ddddddddddddddddddk
ccccccccccccccccccl

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



    下列所有的字符集都可以放置于[]之中,用于匹配字符集范围内的单个字符;

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

 [[email protected] ~]# grep "[[:lower:]]" a.txt
aaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbb

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




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


[[email protected] ~]# grep "[[:upper:]]" a.txt
DDDDDDDDDDDDDCCCCCC
AAACACABCAAABCAAAAA

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


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


[[email protected] ~]# grep "[[:alpha:]]" a.txt
DDDDDDDDDDDDDCCCCCC
AAACACABCAAABCAAAAA
aaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbb

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



4、[:digit:]:所有单个的十进制数字;

[[email protected] ~]# grep "[[:digit:]]" a.txt
ccccccccccccccc2222

(匹配单个十进制数字存在的行)




5、[:alnum:]:所有的字母和十进制数字;


[[email protected] ~]# grep "[[:alnum:]]" a.txt
DDDDDDDDDDDDDCCCCCC
AAACACABCAAABCAAAAA
aaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbb
ccccccccccccccc2222

(匹配所有的字母和十进制数字)




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


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

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



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


[[email protected] ~]# grep "[[:space:]]" a.txt |wc -l
3

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



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

               [[email protected] ~]# grep "[a-z]" a.txt         
               aaaaaaaaaaaaaaaaaa
               bbbbbbbbbbbbbbbbbbb
               ccccccccccccccc2222

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


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

[[email protected] ~]# grep "[A-Z]" a.txt                             
DDDDDDDDDDDDDCCCCC
AAACACABCAAABCAAAAA

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


    10、[0-9]:仅表示所有的十进制数码;

[[email protected] ~]# grep "[0-9]" a.txt 
ccccccccccccccc2222

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





    次数匹配类:该类字符前面的一个字符可以出现的次数;

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

[[email protected] ~]# grep "AAA*" a.txt  
AAACACABCAAABCAAAAA

(匹配有AAA的行)



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

    [[email protected] ~]# echo /etc/passwd | grep -o "[^/]*/\?$"
    passwd

    (输出某个路径的基名)



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

[[email protected] ~]# grep "A\{2,5\}" a.txt  
AAACACABCAAABCAAAAA

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



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

[[email protected] ~]# grep "A\{5\}" a.txt  
AAACACABCAAABCAAAAA

(匹配打的A在本行中必须出现5次,匹配结果是最后的AAAAA)


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

    [[email protected] ~]# grep "A\{1,\}" a.txt  
AAACACABCAAABCAAAAA

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


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

[[email protected] ~]# grep "a\{,1\}" b.txt  
aabaaabacccvv
ababababababa
cccccccccccca

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

次)



    7、注意:在正则表达式中,表示任意长度的任意字符:".*"

    
[[email protected] ~]# grep "^[[:space:]].*" /etc/grub2.cfg

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


    位置锚定字符:

    行锚定:

    行首锚定:^

    行尾锚定:$

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

    空白行数


    字锚定

    字首锚定:\<或\b

    字尾锚定:\>或\b


   

[[email protected] ~]# 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

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


或者:

\|:将其左右的字符或字符串当做整体来对待;

"C\|cat" C cat


[[email protected] ~]# ifconfig | grep "\<[0-9]\>\|\<[1-9][0-9]\>"

(找出ifconfig中一位数或者两位数)




扩展的正则表达式元字符:ERE

        字符匹配类:

            1、".":匹配任意的单个字符;

            [[email protected] ~]# egrep "a.b" a.txt
            aaaaaabbbabcabccccc
            abcabcabcbcacbaaaaa

            (匹配a和b中间跟上任意字符的行,结果分别为abc,以及acb)



           2、 "[]":匹配任意指定范围内的单个字符;

            [[email protected] ~]# egrep "[a]" a.txt
            aaaaaabbbabcabccccc
            abcabcabcbcacbaaaaa

            (匹配只有a的行)


            3、[^]:匹配任意指定范围以外的单个字符;

            [[email protected] ~]# egrep "[^abc]" a.txt
            ddddddddddddddddddk
            ccccccccccccccccccl

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



            下列所有的字符集都可以放置于[]之中,用于匹配字符集范围内的单个字符;

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

                [[email protected] ~]# egrep "[[:lower:]]" a.txt
                aaaaaaaaaaaaaaaaaaa
                bbbbbbbbbbbbbbbbbbb

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




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

                [[email protected] ~]# egrep "[[:upper:]]" a.txt
                DDDDDDDDDDDDDCCCCCC
                AAACACABCAAABCAAAAA

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


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

                [[email protected] ~]# egrep "[[:alpha:]]" a.txt
                DDDDDDDDDDDDDCCCCCC
                AAACACABCAAABCAAAAA
                aaaaaaaaaaaaaaaaaaa
                bbbbbbbbbbbbbbbbbbb

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



                4、[:digit:]:所有单个的十进制数字;

                [[email protected] ~]# egrep "[[:digit:]]" a.txt
                ccccccccccccccc2222

                (匹配单个十进制数字存在的行)




                5、[:alnum:]:所有的字母和十进制数字;

                [[email protected] ~]# egrep "[[:alnum:]]" a.txt
                DDDDDDDDDDDDDCCCCCC
                AAACACABCAAABCAAAAA
                aaaaaaaaaaaaaaaaaaa
                bbbbbbbbbbbbbbbbbbb
                ccccccccccccccc2222

                (匹配所有的字母和十进制数字)




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

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

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



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

                [[email protected] ~]# egrep "[[:space:]]" a.txt |wc -l
                3

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



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

                [[email protected] ~]# egrep "[a-z]" a.txt 
                aaaaaaaaaaaaaaaaaaa
                bbbbbbbbbbbbbbbbbbb
                ccccccccccccccc2222

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


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

                [[email protected] ~]# egrep "[A-Z]" a.txt 
                DDDDDDDDDDDDDCCCCCC
                AAACACABCAAABCAAAAA

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


                10、[0-9]:仅表示所有的十进制数码;

                [[email protected] ~]# egrep "[0-9]" a.txt 
                ccccccccccccccc2222

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





        次数匹配类:该类字符前面的一个字符可以出现的次数;

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

            [[email protected] ~]# egrep "AAA*" a.txt  
            AAACACABCAAABCAAAAA

            (匹配有AAA的行)



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

            [[email protected] ~]# echo /etc/passwd | egrep -o "[^/]*/?$"
            passwd

            (输出某个路径的基名)



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


 

          [[email protected] ~]# egrep "A{2,5}" a.txt  
            AAACACABCAAABCAAAAA

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



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

            [[email protected] ~]# egrep "A{5}" a.txt  
            AAACACABCAAABCAAAAA

            (匹配打的A在本行中必须出现5次,匹配结果是最后的AAAAA)


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

            [[email protected] ~]# egrep "A{1,}" a.txt  
            AAACACABCAAABCAAAAA

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


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

            [[email protected] ~]# egrep "a{,1}" b.txt  
            aabaaabacccvv
            ababababababa
            cccccccccccca

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

            次)



            7、注意:在正则表达式中,表示任意长度的任意字符:".*"

            [[email protected] ~]# grep "^[[:space:]].*" /etc/grub2.cfg

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


        位置锚定字符:

            行锚定:

                行首锚定:^

                行尾锚定:$

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

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


            字锚定

                字首锚定:\<或\b

                字尾锚定:\>或\b


               

 [[email protected] ~]# ifconfig | egrep "\<[0-9]\>|\<[1-9][0-9]\>"

                (找出ifconfig一位数或者两位数)


                


        分组与前向引用字符:

            ():将()中包含的内容作为一个不可分割的整体来处理;

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

                是正则表达式处理引擎的内置变量,\1表示前面所出现的第一组小括号中所阔扩选的内容;\2表示前面所出现的第二组小括号中扩选的内容;...                

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


            或者:

                |:将其左右的字符或字符串当做整体来对待;

                "C|cat" C cat


 

     [[email protected] ~]# ifconfig | grep "\<[0-9]\>|\<[1-9][0-9]\>"

                (找出ifconfig中一位数或者两位数)



grep系中常用命令:

1、-A num:同时显示被PATTERN匹配到的行及其后续num行;


[[email protected] ~]# 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行;

[[email protected] ~]# 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行;

[[email protected] ~]# 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]:以高亮颜色表示被匹配到的内容;


[[email protected] ~]#  grep --color=auto ‘^sshd‘ /etc/passwd
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

(sshd为加上颜色的)



5、-c,--count:不输出被PATTERN匹配的行的内容,而是输出被PATTERN匹配到的行数;

[[email protected] ~]# grep  -c "^[[:space:]]*$" /etc/grub2.cfg 
17

6、-E:可以使GREP命令支持扩展正则表达式元字符;相当于egrep命令;

[[email protected] ~]# ifconfig | grep  -E "\<[0-9]\>|\<[1-9][0-9]\>"


7、-F:--fixed-string:相当于fgrep;



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

[[email protected] ~]# grep -e "AAA*" -e "aaa*" a.txt 
AAACACABCAAABCAAAAC
aaaaaaaaaaaaaaaaaaa


9、-f FILE, --file=FILE:从指定的文件中读取多个PATTERN用于一次搜索;

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

(从其中找出相同的字符进行匹配)



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

[[email protected] ~]# grep -i "[[:upper:]]" a.txt 
DDDDDDDDDDDDDCCCCCC
AAACACABCAAABCAAAAC
aaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbb
ccccccccccccccc2222

(-i忽略大小写,本来是匹配大写字母,最后连小写字母也一起匹配上)



11、-o, --only-matching:仅显示被PATTERN匹配到的部分;关闭了贪婪模式;

(取得字符串很有用)

[[email protected] ~]# echo /etc/passwd | grep -o "[^/]*/\?$"
[[email protected] ~]# passwd

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

    12、-q, --quiet, --silent:安静模式;没有输出结果;相当于grep > /dev/null



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

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




以上是关于grepegrep命令及正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

grepegrep及正则表达式

grepegrep及相应的正则表达式和用法

grepegrep及相应的正则表达式用法

编程语言和shell编程的基础内容以及grepegrep命令及相应的正则表达式和用法

编程语言和shell编程的基础内容以及grepegrep命令及相应的正则表达式和用法

Linux中的grepegrep及相应的正则表达式和用法