一、正则表达式
       正则表达式模式利用元字符表示数据流中的一个或多个字符。在Linux中,常用的正则表达式有两种分别为:基本正则表达式和扩展正则表达式。
        1、基本正则表达式的元字符
        basic regexp:基本正则表达式中的元字符:
            匹配字符:
                   .:匹配任意单个字符 
                   [ ]:指定范围内的任意单个字符
                   [^]:对指定范围内的字符取反
           匹配字符集:       
                   [:digit:] :      数字集
                   [:lower:]:    小写字母
                   [:upper:]:    大写字母
                   [:space:]:   所有的空白字符
                   [:alpha:]:    所有的字母
                   [:alnum:]:   所有的字母和数字
                   [:punct:]:    所有的标点符号
                   [^[:space:]]:取反
            匹配次数:
                    *:匹配其前面的字符任意次     ab*c: abc, abbc, ac
                    .*:任意长度的任意字符,贪婪模式
                    \?: 匹配前面的字符的0次或1次   ab?c:abc,ac
                    A \{m,\}: 匹配A至少m次
                    A\{0,n\}: 匹配A至多n次  
                    A\{m\}:匹配Am次              
          锚定符:
                  ^:锚定行首  
                  $:锚定行尾 
                  \<, \b 锚定词首 
                  \>, \b 锚定词尾 
        分组引用 :\(\)
               后向引用:\1:匹配第一个括号出现的单词
                                 \2:匹配第二个括号出现的单词
                eg:\(abc\(def\)\)   \1:结果为  abcdef
                                              \2:结果为def

         正则表达式的常用元字符就是以上所述。下面综合举几个例子加以说明。
        r[a-z]*t:匹配以r开头中间出现任意字符并以t结尾的字符串
        r[a-z]\{1,\}t:匹配以r开头中间至少出现一个字符并以t结尾的字符串
        ^r..t  : 出现在行首的以r开头,中间出现任意两个字符,并以t结尾的行
        g$:  表示以g结尾的行
        ^$:空白行
        \<r..t:以r开头中间出现任意两个字符并以t结尾的单词
        ^user[0-9]\{1,\}\>:查找当前系统上名字为user后面跟了数字的用户的相关信息
        2、扩展的正则表达式
        扩展的正则表达式的元字符有:
              ?:表示匹配前面的字符0次或1次
              +:次数匹配,匹配其前的字符至少1次;
             {m,}:至少匹配m次
             {0,n}:至多匹配n次
             {m}:刚好匹配m次
             |:表示或者。(C|c)at匹配的结果为Cat,cat。
        下面以解析电子邮件地址为例:
        电子邮件的基本形式为:username@hostname
        username的值可以使用任意字母数字,以及圆点、短划线、加号和下划线等几个特殊字符。而且这些字符可以任意形式的组合出现。 hostname部分由一个或多个域名和服务器名组成。服务器和域名也必须遵守严格的命名规则,仅允许字母数字以及圆点的字符。
       从左向右设计正则表达式,用户名应该是:^([a-zA-Z0-9_\-\.\+]+)@
       使用相同的方法匹配服务器名和子域名:([a-zA-Z0-9_\-\.]+)
       对于顶级域名有特殊的规则。顶级域名只能是字母字符并且不能少于2个且多于5个字符。故用于顶级域名的正则表达式为:\.([a-zA-Z]{2,5})$
         将它们整合到一起便可得到电子邮件的地址:
         ^([a-zA-Z0-9_\-\.\+]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5}$

二、grep的用法
        grep是一个文本过滤工具,它可以逐行的搜索匹配条件的文本,并将匹配的行显示出来。它的匹配条件是正则表达式。
       grep的基本用法为:grep [options] PATTERN  file1 ...
       grep的几个重要的选项有:
                  -v: 对结果取反
                   -i: 忽略字母大小写
                  -o: 仅显示匹配到的字符串
                  -E: 支持扩展正则表达式
                  -A n: 除匹配行外还显示匹配行的下n行
                  -B n: 除匹配行外还显示匹配行的上n行
                  -C n: 除匹配行外还显示匹配行的上下各n行
                  - -color:对匹配的结果以不同的颜色显示

        下面通过几个例子理解grep的使用
         1、显示/proc/meminfo文件中以不区分大小的s开头的行
                grep --color "^[Ss]"  /proc/meminfo   

                
         2、显示/etc/passwd中以nologin结尾的行;
                grep --color  "nologin$"  /etc/passwd

                
         3、显示/etc/inittab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行;
                grep "^#[[:space:]]\{1,\}[^[:space:]]"   /etc/initta

               
         4、显示/etc/inittab中包含了:一个数字:(即两个冒号中间一个数字)的行;
                grep ":[0-9]:"  /etc/inittab

               
         5、显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行;
                grep "^[[:space:]]\{1,\}"  /boot/grub/grub.conf

               
         6、显示/etc/inittab文件中以一个数字开头并以一个与开头数字相同的数字结尾的行;
                 grep --color "^\([0-9]\).*\1$"  /etc/inittab 

               
         7、取出/etc/inittab中的非空白行
                grep -v "^$"  /etc/initta

        其实对于grep的掌握关键在于对正则表达式的理解和熟练应用。所以应多加练习正则表示式。