首页 > 代码库 > linux初学之——正则表达式及grep系

linux初学之——正则表达式及grep系

     grep  sed   awk 被称为文本处理三剑客,本篇主要讲下grep。

     

      grep: Global search Regular Expression and Print out the line

            利用正则表达式进行全局搜索并将匹配的行显示出来;

    想要对grep进行深入了解就要先对正则表达式进行初步认知和学习,接下来,我们先介绍下正则表达式。


  正则表达式

     正则表达式:是一类字符所书写出的模式(pattern);元字符:不表示字符本身的意义,用于额外功能性的描述。

   

    正则表达式元字符:

       基本的正则表达式  BRE

        GLOBBING------简化版的正则表达式:[] ? *


        字符匹配:

          . :匹配任意单个字符

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

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

          所有字符集都可以放置[]之中用于匹配单个字符

          [:lower:]: 所有小写字母

          [:upper:]: 所有大写字母

          [:alpha:]: 所有字母

          [:digit:]: 所有十进制数字

          [:space:]: 空白字符

          [:alnum:]: 字母或数字

          [:punct:]: 所有标点符号

          [:xdigit:]:所有16进制数字

          a-z:所有小写字母

          0-9:所有10进制数字


        次数匹配:  该类字符之前的那个字符可以出现的次数

          *:其前面的字符可以出现任意次(0,1,多次)

          \?:其前面的字符可有可无(0/1次)

          \+:其前面的字符至少出现一次(一次或多次)

          \{num\}:其前面的字符必须出现m次

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

          \{,n\}:其前面的字符至少出现0次至多出现n次;

           \{m,\}:其前面的字符至少出现m次,多多益善;


       在正则表达式中表示任意长度任意字符的方式: .*


       位置锚定字符:

         行锚定:

           行首锚定:^

           行尾锚定:$

         字锚定:

           字首锚定:\<    \b

           字尾锚定:  \>    \b

            \b :旧版本中的锚定方法,建议不用


         对于正则表达式引擎来说,字是由非特殊字符组成的连续字符串;


       分组与引用字符:

         \(PATTERN\) :将此PATTERN所匹配到的所有字符当做一个不可分割的整体来处理

         在正则表达式引擎当中有一系列的内置变量,这些变量会保存所有分组内的字符信息,用于后向引用;这些变量依次是:\1 , \2 \3  ....

         pattern1\(pattern2\)pattern3\(pattern4\(pattern5\)\)

         \1:第一组小括号中pattrn匹配到的字符即pattern2

         \2:第二组小括号中pattrn匹配到的字符即pattern4

         \3:第三组小括号中pattrn匹配到的字符即pattern5


         或:

            \|


          注意:\| 将其左右两边的字符串当做整体对待

       

      扩展正则表达式  ERE

       与基本正则不相同的部分:

        +: 匹配其前面的字符至少 1 次

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

       {m,n}: 匹配其前面的字符至少 m 次,至多 n 次
       (): 分组
        a|b: a 或者 b

     

    在对正则表达式进行初步了解后在继续学习 grep

         

     grep [OPTIONS] PATTERN [FILE...]

        PATTERN:过滤条件,是由正则表达式元字符以及没有特殊含义的文本字符组成;

          正则表达式的元字符:会被正则表达式的引擎解释为特殊含义;

             pcre-perl:语言的正则表达式引擎

             基本额正则表达式:BRE

             扩展的正则表达式:ERE

         grep默认情况下仅支持基本正则表达式

         egrep默认仅支持扩展正则表达式

         fgrep默认不开启表达式引擎


          文本字符:只具备字符表面含义的那些字符

        常用选项:

           -i, --ingore-case:忽略文本字符的大小写

           -v, --invert-match:反向匹配;最终显示的结果是PATTERN不能成功匹配的行

           -c, --count:计数,统计匹配PATTERN的所有行数

           -o ,--only-mathing:关闭贪婪模式,仅显示PATTERN能匹配的内容

           -q,--quiet,--silent:安静模式,不输出任何匹配结果

           --color [=WHEN], --colour[=WHEN] :将匹配PATTERN的内容以高亮形式显示  --color=auto

           -E:扩展的正则表达式,grep -E相当于 egrep

           -F: grep -F相当于fgrep,

           -G:基本的正则表达式,egrep -G相当于grep

           -P;使用PCRE(Perl Common Regular Expression)引擎

           -A NUM, --after-context=NUM  :显示匹配PATTERN行的同时显示其后面的NUM行

           -B NUM, --before-context=NUM :显示匹配PATTERN行的同时显示其前面的NUM行

           -C NUM, -NUM, --context=NUM  :显示匹配PATTERN行的同时显示其前后的NUM行

    

    

       grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]


    默认情况下,grep命令后面只允许有一个pattern,如果想要在一次grep搜索过程中写多个pattern需要使用-e选项,每个-e选项只能使用一个pattern作为参数;

       将需要的PATTERN写入到一个文件中, 保证每行只有一个PATTERN;使用-f FILE方式来实现多PATTRN作为参数;

   

   

   其他的文本处理命令:

     wc:

        wc[OPTION]...[FILE]

        -l: 只显示行数

        -w: 只显示字数

        -c: 只显示字符数


     cut:  remove sections from each line of files

         能够被cut修剪的文件,一般都是具有一定结构或格式的文本文档;

          cut OPTION... [FILE]...

            -d, --delimiter=DELIM:指定在实施修剪操作时所依赖的分隔符,默认是空白符

            -f,--fields=LIST:根据定义的分隔符来指定字段的编号

                地址定界使用方法:

                   #:选择被指定的单个字段

                   #,#:离散的多个被指定的单个字段

                   #-#:连续的多个被指定的字段

             --output-delimiter=STRING:指定输出分隔符


  grep练习题:

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

        #  grep -v ‘bash$‘

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

        #  grep -v ‘/sbin/nologin$‘ /etc/passwd

  3) 找出/etc/grub2.cfg(在CentOS6中是/etc/grub.conf)文件中,以空白字符开头的非空白行;

       # grep --color=auto ‘^[[:space:]]\+[^[:space:]]‘ /etc/grub2.cfg

  4)显示当前系统上rootx或bash用户的默认shell;

     # grep -E ‘^(root|bash):‘ /etc/passwd | cut -d: -f7

 5)找出/etc/rc.d/init.d/functions文件中某单词后跟一组小括号“()”行;

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

  6) 找出"ldd /usr/bin/vim"命令的结果中所有的文件路径;

       # ldd /usr/bin/vim | cut -d‘ ‘ -f3 

   7) 找出/proc/meminfo文件中,所有以大写S或小写s开头的行,你有多少种方法实现该任务?

        # cat /proc/meminfo | grep ‘^[sS]‘

        # cat /proc/meminfo | grep ‘^[s|S]‘

        # cat /proc/meminfo | grep -i ‘^s‘


















       

linux初学之——正则表达式及grep系