一、grep是什么?

    Grep : global search regular expression(RE) and print out the line,全面搜索正则表达式,并把行打印出来,是一个可以从文本或流中查找字符串的一个命令行工具,它可以通过使用正则表达式来更加灵活的查找一个字符 串,就是通过复杂模式进行查找以满足你的需求。

二、正则表达式的分类

    1、基本正则表达式:BRE(BASIC REGULAR EXPRESSION)

    2、拓展正则表达式:ERE(EXTEND REGULAR EXPRESSION)

    3、perl正则表达式:PRE(PERL REGULAR EXPRESSION)

三、grep、sed、awk家族的特点

    1、grep、egrep、fgrep正则的特点

        1)grep支持BRE、ERE、PRE

            a.grep指令不跟任何参数,则表示使用BRE

            b.grep指令后跟-E参数,则表示使用ERE

            c.grep指令后跟-P参数,则表示使用PRE

        2)egrep支持ERE、PRE

            a.egrep指令不跟任何参数,则表示使用ERE

            b.egrep指令后跟-P参数,则表示使用PRE

        3)fgrep默认固定字符串模式
            a.fgrep默认不支持BRE、ERE,只支持固定字符串模式,速度相比grep,egrep都要

            b.fgrep指令后跟-G选择,则表示支持BRE

    2、sed正则表达式特点

        1)sed支持BRE、ERE

            a.默认支持BRE

            b.sed指令后跟-r参数,则表示使用ERE

            c.sed用来处理文本文件,对文本文件的内容进行curd操作,按行进行处理

    3、awk正则表达式特点

        1)awk(gawk)正则表达式特点

            a.默认支持ERE

            b.只要对文本文件的列进行处理

四、grep命令的基本使用

    1、grep的使用语法

        1)grep [option] pattern [FILE...]    

    2、grep常用选项

        1)-c:之输出匹配行的数目

        2) -i:不区分打小写

        3) -r:递归查找(当前搜索目录以及其子目录)

        4) -n:输出匹配的行及行号

        5)-l:多文件查找时只输出匹配字符串的文件名

        6)-v:反向匹配,即显示不匹配的行

        7)-o:仅显示匹配到的字符串的本身

        8)-q:相当于--quiet,静默模式(可以用来判断此次查找是否包含此字符串,适合在脚本中使 用

        9) -F:--fix-string支持使用固定字符串,不支持正则表达式,相当于fgrep

        10)-G:--base-regex支持使用基本正则表达式,对egrep,fgrep有效

        11)-f:--file=FILE,FILE为每一个grep脚本,用脚本中的贵族匹配

        12)-e:pattern,--regex=pattern,多模式匹配

        13)-A:NUM ,--after-context,显示匹配到内容的后NUM行

        14)-B:NUM ,--before-context,显示匹配到内容的前NUM行

        15)-C:NUM ,显示匹配到内容的前后各NUM行

        Notice:如果正则表达式中有元字符,则要使用引号扩起来,模式中有变量则使用双引号, 否则  使用单引号。

        a.centos7:使用grep的别名,匹配到的结果默认高亮显示

            linux文本处理利器之grep_grep

        b.centos6:默认没有使用

            linux文本处理利器之grep_详解_02

      3、基于基本正则表达式元字符的使用

       1) 字符匹配

            a.  .匹配任意单个字符

            linux文本处理利器之grep_详解_03

           b.[] 匹配指定范围内的单个字符

            linux文本处理利器之grep_详解_04

           c. [^]匹配范围之外的字符

            linux文本处理利器之grep_详解_05

        2) 次数匹配

            a. * 匹配前面的字符任意次(0,1或多次)

             linux文本处理利器之grep_详解_06

            b. .* a后面任意长度的任意字符

             linux文本处理利器之grep_grep_07

            c. \+ 匹配前面的字符至少一次

             linux文本处理利器之grep_grep_08

            d. \? 匹配前面的字符0或1次

             linux文本处理利器之grep_grep_09

            e. \{m\}其前面的字符出现m次,m为非负整数

             linux文本处理利器之grep_详解_10

            f. \{m,n\}其前面的字符出现m次,m为非负整数

                 \{0,n\} 至多n次

                 \{m,\} 至少m次

             linux文本处理利器之grep_grep_11

        3) 位置锚定

           限制模式匹配到的文本,只能出现在目标文本的那个位置

            a. ^ 行首锚定,用于模式的最左侧,^pattern

              linux文本处理利器之grep_grep_12

            b. $ 行尾锚定,用于模式的最右侧,$pattern

              linux文本处理利器之grep_grep_13

            c. ^pattern$ 匹配整行

               ^$ 用来匹配空行

             linux文本处理利器之grep_grep_14

        4) 单词锚定

            a. \<或\b 词首锚定,用于单词模式的左侧,格式为\<pattern,pattern\b

             linux文本处理利器之grep_详解_15

            b. \>或\b 词尾锚定,用于单词模式的右侧,格式为pattern\>,pattern\b

             linux文本处理利器之grep_grep_16

       5) 分组与引用

            a. \(pattern\) 将此次匹配到的字符串作为一个不可分割的整体进行处理

             linux文本处理利器之grep_grep_17

       6)| 或者

            a. a|b 表示a或者b, 表示的是整个表达式的左侧或者是右侧

             linux文本处理利器之grep_详解_18

五、egrep之拓展表达式

     支持使用正则表达式的文本搜索工具,其元字符与grep元字符相同,用户基本相同,这里就不在概述。

    1.拓展表达式元字符

        1)字符匹配

            a..:任意单个字符

            b.[]:指定范围内的单个字符

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

        2)匹配次数

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

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

            c.+:匹配其前面的字符1次或多次

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

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

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

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

        3)位置锚定

            a.^:行首锚定

            b.$:行尾锚定

            c.\<,\b:词首锚定

            d.\>,\b:词尾锚定

        4)分组与引用

            a.(pattern):括号中模式匹配到的字符串会被记录到正则表达式引擎的内置变量中

            b.反向引用\1,\2

        5)或者

            b.(c|C)cat:表示cat或Cat

            C.c|cat:表示c或cat

六、grep、egrep使用案例

        1.显示/etc/passwd文件中不以bash结尾的行

            grep:grep -v 'bash$' /etc/passwd

            egrep:egrep -v 'bash$' /etc/passwd

        2.找出/etc/passwd文件中的三位数或者四位数

            grep:grep '\<{3,4}\>' /etc/passwd

            egrep:egrep '\<[0-9]{3,4}\>' /etc/passwd

        3.找出/etc/grub2.cfg文件中,以至少一个空白字符开头的行,后面又跟了非空白字符的行

            grep:grep '^[[:space:]]\+[[:space:]]' /etc/grub2.cfg

            egrep:egrep '^[[:space:]]+[[:space:]]' /etc/grub2.cfg

        4.找出netstat -tan命令中的结果中,以'LISTEN'后跟0或多个非空白字符的行

            grep:netstat -tan | grep 'LISTEN[[:space:]]*$'

            egrep:netstat -tan | grep 'LISTEN[[:space:]]*$'

        5.找出fdisk -l命令中的结果中,包含以/dev后跟sd或hd及一个小写字母的行

            grep:fdisk -l | grep '/dev/[sh]d[a-z]\>'

            egrep:fdisk -l | egrep '/dev/[sh]d[a-z]\>'

        6.找出ldd /usr/bin/cat命令结果中文件路径

            grep:ldd /usr/bin/cat | grep -o '/[^[:space:]]+'

            egrep:ldd /usr/bin/cat | egrep -o '/[^[:space:]]\+'

        7.找出/etc/meminfo文件中,所有以大写或小写s开头的行

            grep:grep '^[sS]' /proc/meminfo

            grep:grep -i '^s' /proc/meminfo

            egrep:grep '^\(s\|S\)' /proc/memfino

        8.显示系统上root,centos,slackware用户的相关信息

            grep:grep '^\(root\|centos\|slackware\)\>' /etc/passwd

            egrep:egrep '^(root|centos|slackware)\>' /etc/passwd

        9.echo一个绝对路径,取出其基名

            grep:echo /etc/passwd | grep '[^/]\+\/\?$'

            egrep:echo /etc/passwd | egrep '[^/]+/?$'

        10.找出ifconfig命令结果中1-255之间的数字

            grep:ifconfig | grep '\<\([1-9]\|[1-9][0-9]]\|1[0-9][0-9]\|2[0-4][0-9]\|25[0-5]\)\>'

            egrep:ifconfig | egrep '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>'

        11.添加用户bash,testbash,basher及nologin,要求前三个用户的默认shell为/bin/bash,nologin的默认shell为/bin/nologin,而后找出其用户名与shell名相同的用户

            useradd -s /bin/bash bash

            useradd -s /bin/bash basher

            useradd -s /bin/bash testsh

            useradd -s /sbin/nologin nologin

            grep:'^([a-z0-9]\+)\>.*\1$' /etc/passwd

            egrep:'^([a-z0-9]+)\>.*\1$' /etc/passwd