什么是grep

       grep全名是Global seach REgular expressionand Print out the line.(全面搜索正则表达式并且显示出来),是一种强大的文本搜索工具,根据用户的文本模式(搜索条件)对目标文件进行逐行搜索,并显示能匹配到(或者不匹配)的行或文本。

         既然grep是全面搜索正则表达式并显示,那正则表达式是什么呢?

 

正则表达式

         正则表达式,(英语:RegularExpression,在代码中常简写为regexregexpRE),是一类字符所书写的模式,其中许多字符不表示字意义,而是表达控制或通配的功能。

         正则表达式是由普通的字符和元字符组成,所谓元字符就是不表示其字面意义,而用额外功能性描述。正则表达式的搜索能力是由程序实现的,所以处理正则表达式的工具又称为正则表达式引擎。很多语言都支持正则表式,只是所支持方式略有不同而已。

         正则表达式分为基本正则表达式和扩展正则表达式,不同的扩展正表达式支持功能多一点,grep支持基本正则表达式,egrep(grep -E) 支持扩展正则表达式,而fgrep不支持正则表达式。

 

基本正则表达式(grep

    语法格试:

        grep[OPTIONS]... PATTERN [FILE...]

 

基本正则表达式的元字符

    1,字符匹配:

 

        .: 匹配任意单个字符

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

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

        [0-9],[[:digit:]] : 匹配单个数字

        [a-z], [[:lower:]] : 匹配单个小字字母

        [A-Z],[[:upper:]] : 匹配单个大字字母

        [a-zA-Z],[[:alpha:]] : 匹配单个不区分大小写的字母

        [0-9a-zA-Z],[[:alnum:]] : 匹配简个数字或不区分大小写的字母

        [[:space:]]: 匹配单个空白字符,包括空格,tab

        [[:punct:]]: 匹配单个标点符号

                           

        

    2,次数匹配元字符:用于实现指定其前的字符所能够出现的次数

 

         *:任意长度,它前面的字符可以出现任意次

        \?0次或1次,它前面的字符是可有可元的

        \{m\}:它前面的字符要现m

        \{m,n\}:它前面出现的字符至少m次,最多n

        \{m,\}:它前面出现的字符至少m

        \{0,n\}:它前面出现的字符最多n

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

        \+:它前面出现的字符1次以上

 

    3,位置锚定:

 

         ^:行首锚定:写在模式最左侧

        $:行尾锚定:写在模式最右侧

        ^$:空白行             

         \<,\b:词首锚定,出现于单词左侧

        \>,\b:词尾锚定,出现于单词右侧

             注意:不包含特殊字符的连续字符组成叫单词

    4,分组

 

        \(\): 比如 \(bash\)

            分组中的模式匹配到内容,可由正则表达式引擎记忆在内存中,之后可以被引用

        

    5,引用

                  

         \#:引用前面的第#个左括号以及与与其匹配右括号中的模式所匹配到的内容  

         \|:比如,a\|b a或者b

 

扩展正则表达式(egrep

 

    语法格式:

        egrep[option]... 'PATTERN' FILE...

        grep-E

        

    扩展正则表达式元字符:

                  

    1,字符匹配

        .:匹配任意单个字符

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

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

                  

    2,次数匹配

                           

        *:任意长度,它前面的字符可以出现任意次

        ?0次或1次,它前面的字符是可有可元的

        +:它前面出现的字符1次以上  

        {m}:它前面的字符要现m

        {m,n}:它前面出现的字符至少m次,最多n

        {m,}:它前面出现的字符至少m

        {0,n}:它前面出现的字符最多n

                  

    3,位置锚定:

 

        ^:行首锚定:写在模式最左侧

        $:行尾锚定:写在模式最右侧

        ^$:空白行             

         \<, \b:词首锚定,出现于单词左侧

        \>, \b:词尾锚定,出现于单词右侧

 

    4,分组

        ():分组

        |:或

 

    5,引用:

        \#:引用前面的第#个左括号以及与与其匹配右括号中的模式所匹配到的内容

 

grep, egrep 命令选项

        

         -o:仅显示匹配的字串,而非字串所在的行

         -v:反向选取

         -iignore-case,忽略字符大小写

         -A-A # ,显示匹配到的行,还要显示匹配到的行下面#

         -B-B #,显示匹配到的行,还要显示匹配到的行上面#

         -C-C #,显示匹配到的行,还要显示匹配到的行各上下#

         --color=auto:匹配到的内容,默认以红色显示

 

举例:

1,显示/etc/passwd文件中其默认shell为非/sbin/nologin的用户 

# grep "/sbin/nologin" -v/etc/passwd | cut -d: -f1

grep正则表达式

 

2,显示/etc/passwd文件中其默认shell/bin/bash的用户,仅显示上述结果中ID号最大的用户

# grep '/bin/bash' /etc/passwd | sort -t:-k3 -n | tail -1 |cut -d: -f1

grep正则表达式

 

3,找出/etc/passwd文件中的一位数或两数

# grep -E --color  "\<[0-9]{1,2}\>" /etc/passwd

grep正则表达式

 

4,显示/etc/rc.d/rc.sysinit文件中,以#开头,后面跟至少一个空白字符,而后还跟至少一个非空白字符

# grep -E "^#[[:space:]]+[^[:space:]]+" /etc/rc.d/rc.sysinit --color

grep正则表达式

 

5,找出当前系统上其用户名和默认shell相同的用户

# grep -E --color"^(\<[[:alpha:]]+[[:alnum:]]*\>).*\1$" /etc/passwd

grep正则表达式

 

6,找出/etc/rc.d/init.d/functions 文件中某单词后跟一组小括号"()"行:

#  grep-E --color -o "\<[[:alpha:]]+\>\(\)" /etc/rc.d/init.d/functions

grep正则表达式

 

7,使用echo 命令输出一个路径,而后使用grep取出其基名      

echo "/etc/sysconfig/network" |grep -o -E "[^/]+/?$" | cut -d/ -f1


grep正则表达式


8,写一个模式,能匹配合理的ipv4地址(1.0.0.1-239.255.255.254 

ifconfig  |   grep  -o      -E "([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-3][0-9])(\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){2}\.([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])"

grep正则表达式