您的位置:首页 > 运维架构 > Linux

Linux学习之十grep及正则表达式(grep)

2017-05-09 15:55 666 查看
一、文本查找的需要:

grep,egrep,fgrep

    1、grep:根据模式搜索文本,并将符合模式的文本行显示出来

        Pattern(模式):文本字符和正则表达式的元字符组合而成匹配条件

        grep [options] PATTERN [FILE...]

            例:[root@Ourlab ~]# grep 'root' /etc/passwd

                root:x:0:0:root:/root:/bin/bash

                operator:x:11:0:operator:/root:/sbin/nologin

            -i:忽略大小写

            --colour:匹配的字符或字符串加颜色

            例:[root@Ourlab ~]# grep --colour 'root' /etc/passwd

                root:x:0:0:root:/root:/bin/bash

                operator:x:11:0:operator:/root:/sbin/nologin

        -v:显示没有被匹配的行

        -o:只显示被匹配的字符串,且以行显示

            例:[root@Ourlab ~]# grep -o 'root' /etc/passwd

                root

                root

                root

                root

    2、通配符:

        *:任意长度的任意字符

        ?:任意单个字符

        []:任意范围内的字符

        [^]:任意范围外字符

    

    3、正则表达式:Regular EXPression(REGEXP)

        元字符:

            .:匹配任意单个字符

                例:[root@Ourlab ~]# grep 'r..t' /etc/passwd

                    root:x:0:0:root:/root:/bin/bash

                    operator:x:11:0:operator:/root:/sbin/nologin

                    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

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

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

               字符集合:[:digit:]数字,[:lower:]小写字母,[:upper:]大写字母,[:punct:]标点符号,[:space:]空格,[:alpha:]所有字母,[:alnum:]所有字母和数字

                例:显示/etc/inittab中以数字结尾的行

                    [root@Ourlab ~]# grep '[[:digit:]]$' /etc/inittab

                    #   5 - X11

                    l0:0:wait:/etc/rc.d/rc 0

                    l1:1:wait:/etc/rc.d/rc 1

            字符次数:

            *:匹配其前面的字符任意次

                例:创建一个文件test.txt,内容为:a,b,ab,aab,acb,adb,amnb,amnbmnb,使用“a*b”进行匹配显示的字符如下:

                    [root@Ourlab ~]# grep 'a*b' test.txt

                    b

                    ab

                    aab

                    acb

                    adb

                    amnb

                    amnbmnb

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

                例:[root@Ourlab ~]# grep 'a.*b' test.txt

                    ab

                    aab

                    acb

                    adb

                    amnb

                    amnbmnb

            \?:匹配其前面的字符1次或0次(使用时需要加转义符\)

                例:[root@Ourlab ~]# grep 'a\?b' test.txt

                    b

                    ab

                    aab

                    acb

                    adb

                    amnb

                    amnbmnb

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

                例:[root@Ourlab ~]# grep 'a\{1,3\}b' test.txt

                    ab

                    aab

            位置锚定:

            ^:锚钉行首,此字符后面的任意内容必须出现在行首

                例:[root@Ourlab ~]# grep '^r..t' /etc/passwd

                    root:x:0:0:root:/root:/bin/bash

            $:锚钉行尾,此字符前面的任意内容必须出现在行尾

                例:[root@Ourlab ~]# grep 'w$' /etc/inittab

                    ca::ctrlaltdel:/sbin/shutdown -t3 -r now

            ^$:空白行

                例:[root@Ourlab ~]# grep '^$' /etc/inittab

            \<或\b:锚钉词首,其后面的任意字符必须作为单词的首部出现

            \>或\b:锚钉词尾,其前面的任意字符必须做为单词的尾部出现

            \<\>或\b\b:其指定的字符必须作为单词出现

                例:创建一个文件test2.txt,内容:This is    root.The user is mroot.rooter is a dog's name.chroot is a command.mrooter    is not a word.

                    例1:[root@Ourlab ~]# grep "root\>" test2.txt

                        This is root.

                        The user is mroot.

                        chroot is a command.

            分组:

            \(\):用于后向引用

                例:\(ab\)*:ab作为一组同时出现或不出现

                    [root@Ourlab ~]# grep --colour "\(ab\)" test.txt

                    ab

                    aab

                \1:引用第一个左括号以及与之对应的右括号所包含的所有内容

                \2:引用第二个左括号以及与之对应的右括号所包含的所有内容

                    例:创建一个文件test3.txt文件内容如下:

                    He love his lover.

                    She like her lover.

                    He like his liker.

                    She love her liker.

                    She like him.

                    例1:使用后引用方法查找test3.txt文件相关出现”l..e“单词并以该单词结尾的行;

                    [root@Ourlab ~]# grep '\(l..e\).*\1' test3.txt

                    He love his lover.

                    He like his liker.

课后练习:

1、分析/etc/inittab文件中如下文本中前两行的特征(每一行中出现在数字必须相同),请写出可以精确找到类似两行的模式:

l1:1:wait:/etc/rc.d/rc 1

l3:3:wait:/etc/rc.d/rc 3

[root@Ourlab ~]# grep '^l\([0-9]\):\1.*\1$' /etc/inittab

l0:0:wait:/etc/rc.d/rc 0

l1:1:wait:/etc/rc.d/rc 1

l2:2:wait:/etc/rc.d/rc 2

l3:3:wait:/etc/rc.d/rc 3

l4:4:wait:/etc/rc.d/rc 4

l5:5:wait:/etc/rc.d/rc 5

l6:6:wait:/etc/rc.d/rc 6
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux 正则表达式