12、grep及正则表达式

12.1 grep

    egrep:扩展正则表达式

    fgrep(快速的搜索): 不支持正则表达式,直接搜索字符本身

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

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

    grep [options] PATTERN [FILE...]

        -i:忽略字母大小写

        --color:对于被选中的目标用颜色显示

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

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

12.2 正则表达式(REGular EXPerssion,REGEXP)

    通常使用的匹配的字符

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

    ?: 任意单个字符

    []:指定范围内的内容

    [^]:制定范围外的内容

12.2.1 正则表达式的元字符:

    1、元字符

        .  : 匹配任意单个字符

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

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

        字符集合:[:digit:], [:lower:], [:upper:], [:punct:], [:space:], [:alpha:], [:alnum:]

    [root@Daniel-R480 ~]# 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

    [root@Daniel-R480 ~]#

    2、匹配次数(贪婪模式,尽可能多的匹配):

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

        a, b, ab, aab, acb, adb, amnb

        a*b:a出现任意次之后跟着b 

    [root@Daniel-R480 ~]# grep 'a*b' test.txt

    b

    ab

    asb

    aab

    abb

    ammjdjfdjb

    asdbsdabsfdab

    a?b:匹配a任意次,然后加上b

    [root@Daniel-R480 ~]# grep 'a\?b' test.txt

    b

    ab

    asb

    aab

    abb

    ammjdjfdjb

    asdbsdabsfdab

    a.*b:a开头,b结尾,中间跟任意字符

    [root@Daniel-R480 ~]# grep 'a.*b' test.txt

    ab

    asb

    aab

    abb

    ammjdjfdjb

    asdbsdabsfdab

    3、匹配规则

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

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

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

            \{1,\}

            \{0,3\}

    [root@Daniel-R480 ~]# grep 'a\{1,3\}b' test.txt

    ab

    aab

    abb

    asdbsdabsfdab

    [root@Daniel-R480 ~]# grep 'a.\{1,3\}b' test.txt

    asb

    aab

    abb

    asdbsdabsfdab

    [root@Daniel-R480 ~]#

    4、位置锚定:

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

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

        ^$: 空白行

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

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

    [root@Daniel-R480 ~]# 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

    [root@Daniel-R480 ~]# grep '&r..t' /etc/passwd

    [root@Daniel-R480 ~]# grep '^r..t' /etc/passwd

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

    [root@Daniel-R480 tmp]# grep "root\>" ./test.txt

    This is root

    the user is mroot

    chroot is a command

    [root@Daniel-R480 tmp]# grep "\>root" ./test.txt

    [root@Daniel-R480 tmp]# grep "root\>" ./test.txt

    This is root

    the user is mroot

    chroot is a command

    [root@Daniel-R480 tmp]# grep "\<root" ./test.txt

    This is root

    rooter is a dog's name

    [root@Daniel-R480 tmp]# grep "\<root\>" ./test.txt

    This is root

    [root@Daniel-R480 tmp]#

    5、分组:

    \(\):把内容分组

        \(ab\)*:ab可以出现任意次

        [root@Daniel-R480 ~]# cat test.txt

        a

        b

        ab

        asb

        aab

        abb

        ammjdjfdjb

        asdbsdabsfdab

        [root@Daniel-R480 ~]# grep "\(ab\)*" test.txt

        a

        b

        ab

        asb

        aab

        abb

        ammjdjfdjb

        asdbsdabsfdab

        [root@Daniel-R480 ~]# grep "\(ab\)\?" test.txt

        a

        b

        ab

        asb

        aab

        abb

        ammjdjfdjb

        asdbsdabsfdab

        [root@Daniel-R480 ~]#

    6、后向引用(被前面括号括起来的字符,可以在后面继续引用他)

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

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

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

    He love his lover.

    She like her liker.

    He like his lover.

    [root@Daniel-R480 ~]# vim test2.txt

    [root@Daniel-R480 ~]# grep 'l..e' test2.txt

    He love his lover.

    She like her liker.

    He like his lover.

    She love her liker.

    [root@Daniel-R480 ~]# grep 'l..e.*l..e' test2.txt

    He love his lover.

    She like her liker.

    He like his lover.

    She love her liker.

    [root@Daniel-R480 ~]# vim test2.txt

    [root@Daniel-R480 ~]# grep 'l..e.*l..e' test2.txt

    He love his lover.

    She like her liker.

    He like his lover.

    She love her liker

    [root@Daniel-R480 ~]# grep 'l..e.*\1' test2.txt

    grep: Invalid back reference

    [root@Daniel-R480 ~]# grep '\(l..e\).*\1' test2.txt

    He love his lover.

    She like her liker.

    l..e:l开头,e结尾

练习:

    1、显示/proc/meminfo文件中以不区分大小的s开头的行;

        [root@Daniel-R480 ~]# grep -i '^s' /proc/meminfo

        SwapCached:            0 kB

        SwapTotal:      31018612 kB

        SwapFree:       31018612 kB

        Shmem:             17720 kB

        Slab:              13868 kB

        SReclaimable:       6744 kB

        SUnreclaim:         7124 kB

        [root@Daniel-R480 ~]# grep '^[sS]' /proc/meminfo

        SwapCached:            0 kB

        SwapTotal:      31018612 kB

        SwapFree:       31018612 kB

        Shmem:             17720 kB

        Slab:              13868 kB

        SReclaimable:       6744 kB

        SUnreclaim:         7124 kB

        [root@Daniel-R480 ~]#

    2、显示/etc/passwd中以nologin结尾的行; 

        [root@Daniel-R480 ~]# grep 'nologin$' /etc/passwd

        bin:x:1:1:bin:/bin:/sbin/nologin

        daemon:x:2:2:daemon:/sbin:/sbin/nologin

        adm:x:3:4:adm:/var/adm:/sbin/nologin

        lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

        mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

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

        games:x:12:100:games:/usr/games:/sbin/nologin

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

        nobody:x:99:99:Nobody:/:/sbin/nologin

        systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin

        dbus:x:81:81:System message bus:/:/sbin/nologin

        polkitd:x:999:998:User for polkitd:/:/sbin/nologin

        rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin

        rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin

        nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

        sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

        postfix:x:89:89::/var/spool/postfix:/sbin/nologin

        chrony:x:998:995::/var/lib/chrony:/sbin/nologin

        test3:x:10014:10014::/home/test3:/sbin/nologin

    取出默认shell为/sbin/nologin的用户列表

        [root@Daniel-R480 ~]# grep 'nologin$' /etc/passwd | cut -d: -f1

        bin

        daemon

        adm

        lp

        mail

        operator

        games

        ftp

        nobody

        systemd-network

        dbus

        polkitd

        rpc

        rpcuser

        nfsnobody

        sshd

        postfix

        chrony

        test3

        [root@Daniel-R480 ~]#

    取出默认shell为bash,且其用户ID号最小的用户的用户名

        [root@Daniel-R480 ~]# grep 'bash$' /etc/passwd | sort -n -t: -k3 | head -1 | cut -d: -f1

        root

    3、显示/etc/inittab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行;

        [root@Daniel-R480 ~]# grep "^#[[:space:]]\{1,\}[^[:space:]]" /etc/inittab

        # inittab is no longer used when using systemd.

        # ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.

        # Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target

        # systemd uses 'targets' instead of runlevels. By default, there are two main targets:

        # multi-user.target: analogous to runlevel 3

        # graphical.target: analogous to runlevel 5

        # To view current default target, run:

        # systemctl get-default

        # To set a default target, run:

        # systemctl set-default TARGET.target

        [root@Daniel-R480 ~]#

    4、显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行;

        [root@Daniel-R480 ~]# grep '^[[:space:]]\{1,\}' /boot/grub/grub.conf

                root (hd0)

                kernel /boot/vmlinuz-3.10.0-957.1.3.el7.x86_64 ro root=UUID=f41e390f-835b-4223-a9bb-9b45984ddf8d console=hvc0 LANG=en_US.UTF-8

                initrd /boot/initramfs-3.10.0-957.1.3.el7.x86_64.img

Comments Closed.