正则表达式:REGEXP
 正则表达式就是由一类特殊字符及文本字符编写的模式,其中有些字符有些字符不表示其字面的意思,而是用于表示控制或通配的功能。


 一、分类
  1.基本正则表达式:BRE
  2.扩展正则表达式:ERE
  它们的不同之处在于元字符不同


 二、grep:
 (一)作用:根据用户指定的“模式(条件)”对目标文件逐个进行匹配检查,打印匹配到的行


 (二)模式:由正则表达式的元字符及文本字符所编写的过滤条件


 (三)选项
   --color=auto:对匹配到的文本着色高亮显示
   -i:ignorecase,忽略字符大小写
   -o:仅显示匹配到的字符本身
   -v:显示不能被模式匹配到的行
   -E:支持扩展的正则表达式元字符
   —q:静默模式,不输出任何信息
   -A #:显示匹配到的行以及其后#行
   -B #:显示匹配到的行以及其前#行
   -C #:显示匹配到的行以及其前后各#行


 (四)基本正则表达式的元字符
   1.字符匹配
     .:任意单个字符
     []:匹配指定范围内的任意单个字符
     [^]:匹配指定范围外的任意单个字符
     [[:upper:]]:所有大写字母
    [[:lower:]]:所有小写字母
    [[:alpha:]]:所有字母
    [[:digit:]]:所有数字
    [[:alnum:]]:所有的字母和数字
    [[:space:]]:所有的空白字符
    [[:punct:]]:所有标点符号


   2.匹配次数:用在要指定其出现的次数的字符后面,用于限制其前面字符出现的次数,默认工作于贪婪模式
     *:匹配其前面的字符任意次;0,1,多次
     .*:匹配任意长度的任意字符
     \?:匹配其前的字符0次或1次,即其前面的字符是可有可无的
     \+:匹配其前面的字符一次或多次,至少一次
     \{m\}:匹配其前面的字符m次
     \{m,n\}:匹配其前面的字符至少m次,至多n次
     \{0,n\}:至多n次
     \{m,\}:至少m次


   3.位置锚定
     ^:行首锚定,用于模式的最左侧
     $:行尾锚定,用于模式的最右侧
     ^PATTERN$:用PATTERN来匹配整行
     ^$:空白行
     ^[[:space:]]*$:空行或包含空白字符的行


   4.单词:非特殊字符组成的连续的字符(字符串)
     \<或\b:词首锚定,用于单词模式的左侧
     \>或\b :词尾锚定,用于单词模式的右侧
     \<PATTERN\>:匹配完整单词


   5.分组及引用
     \(\):将一个或多个字符捆绑到一起,当作一个整体处理,分组括号中的模式匹配到的内容会被正则表达式引擎自动记录于内部的变量中,这些变量为
     \1:从模式左侧起,第一个括号以及与之匹配的右括号之间的模式所匹配到的字符
     \2:从模式左侧起,第二个括号以及与之匹配的右括号之间的模式所匹配到的字符
     \3:从模式左侧起,第三个括号以及与之匹配的右括号之间的模式所匹配到的字符


   6.后向引用:
     引用前面分组括号中的被模式匹配到的字符


 (五)示例
   1.显示/etc/passwd文件中不以/bin/bash结尾的行;
    # grep -v "/bin/bash&" /etc/passwd            
   2、找出/etc/passwd文件中的两位数或三位数;
    # grep "\<[0-9]\{2,3\}\>" /etc/passwd
   3、找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行;
    # grep "\<^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg
   4、找出"netstat -tan"命令的结果中以'LISTEN'后跟0、1或多个空白字符结尾的行;
    # netstat -tan | gerp "LISTEN[[:space:]]*$"
   5、找出ifconfig命令结果中的1-255之间的数值;
    # ifconfig | grep -E -o "[1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]"


 三、egrep:
  支持扩展的正则表达式类似于grep文本过滤功能:grep -E
 (一)选项
   -i:ignorecase,忽略字符大小写
   -o:仅显示匹配到的字符本身
   -v:显示不能被模式匹配到的行
   -E:支持扩展的正则表达式元字符
   —q:静默模式,不输出任何信息
   -A #:显示匹配到的行以及其后#行
   -B #:显示匹配到的行以及其前#行
   -C #:显示匹配到的行以及其前后各#行
   -G:支持基本正则表达式


 (二)扩展正则表达式的元字符
   1.字符匹配
     .:任意单个字符
     []:指定范围内的单个字符
     [^]:指定范围外的单个字符


   2.次数
     *:任意次,0,1,多次
     ?:0,1,其前的字符可有可无
     +:至少一次
     {m}:至少m次
     {m,n:至少m次,至多n次
     {0,n}:至多n次
     {m,}:至少m次


   3.位置锚定
     ^:行首锚定
     $:行尾锚定
     \<,\b:词首锚定
     \>,\b:词尾锚定


   4.分组及引用
     ():括号内的模式匹配到的字符会被记录于正则表达式引擎的内部变量中;


   5.后向引用:\1,\2,...


   6.或
     a|b:a或者b,表示整个左侧和右侧
     (C|c)at:Cat或cat


  (三)示例
   1、找出/proc/meminfo文件中,所有以大写或小写S开头的行;
     # grep "^[Ss]" /proc/meminfo                 
   2、显示当前系统上root、centos或user1用户的相关信息;
     # grep -E "^(centos|root|user1)"\> /etc/passwd  
   3、找出/etc/rc.d/init.d/functions文件中某单词后面跟一个小括号的行;
     # grep -E -o "[_[:alnum:]]+\(\)" /etc/rc.d/init.d/functions
   4、使用echo命令输出一绝对路径,使用egrep取出基名;
     # echo etc/passwd | grep -E "/[[:alnum:]]$"