grep文本过滤 / 正则表达式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了grep文本过滤 / 正则表达式相关的知识,希望对你有一定的参考价值。


一、grep:

        

    作用:

1、文本搜索工具;

        2、基于Pattern(过滤条件)对目标文本逐行进行匹配

3、打印出符合条件的行

    模式:    

        1、由文本字符及正则表达式元字符所编写的过滤条件

         2、模式通过正则表达式引擎匹配搜索

         3、正则表达式引擎:利用正则表达式分析给定文本的程序;

    格式

        grep [OPTIONS] PATTERN [FILE...]

       -i 忽略字符大小写;

 -o : 仅显示匹配到的文本自身    

 -v : 反向匹配

 -E : 支持扩展正则表达式

 -q : 静默模式,不输出任何信息

-A# : 展示匹配到的文本的当前行和后#行

-B# : 展示匹配到的文本的当前行和前#行

-C# : 展示匹配到的文本的当前行和前后各#行

       --color=auto : 对匹配到的文本高亮显示 


   基本正则表达式元字符


    字符匹配:


      "." : 匹配任意单个字符;

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

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

          [:digit:]所有数字            [:alnum:]所有数字和字母  

          [:lower:]只显示小写字母      [:space:]空白字符

          [:upper:]只显示大写字母      [:punct:]标点符号

          [:alpha:]所有字母

      

     匹配次数:

                用在要指定其出现的次数的字符后面,用限制其前面的字符要出现的次数;默认工作于贪婪模式


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

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

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

 \? : 匹配前面的字符0次或一次,即前面的字符可有可无

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

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

    \{0,n\} : 之多出现n次

     \{m,\} : 至少m次

     位置锚定:

     限制模式所匹配到的文本只能出现于目标文本的哪个位置

 ^ : 行首锚定:用于模式的最左侧:^PATTERN

 $ : 行尾锚定:用于模式的最右侧:PATTERN$

 ^PATTERN$ : 匹配完整一行;

^$ : 匹配空行;等同于^[[:space:]]*$;

    \<或\b : 词首锚定,用于单词最左侧,格式为\<PATTERN,\bPATTERN

    \>或\b : 词尾锚定,用于单词最右侧,格式为PATTERN>\,PATTERN\b

       \<PATTERN\> : 单词锚定

     分组与引用:

\(PATTERN\): 将此PATTERN匹配到的字符当作一个不可侵犯的整体进行处理;

        \n : 模式中第n个左括号以及与之匹配的右括号之间的模式所匹配到的字符串;


                  练习:找出用户名和shell同名的用户                 

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


 或者: "|"

       a|b : a或者b

     C|cat : 表示C或者cat

   (C|c)at : 表示Cat或cat

**************************************************************************************************************************

egrep:

        egrep [OPTIONS] PATTERN [FILE...]

 扩展正则表达式元字符:


        字符匹配:

"." : 任意单个字符

[ ] : 范围内的任意单个字符

       [^ ] : 范围外的任意单个字符

  匹配次数:

  * : 任意次

  ?: 0次或1次

  + : 1次或多次

{m} :匹配m次

      {m,n} : 至少m次至多n次

       {m,} :至少m次至多不限

  位置锚定:

 ^  : 行首锚定

 $  : 行尾锚定

      \<,\b : 词首锚定

      \>,\b : 词尾锚定

 

分组及引用:

       (PATTERN): 将此PATTERN匹配到的字符当作一个不可侵犯的整体进行处理;

       \1,\2... : 模式中第n个左括号以及与之匹配的右括号之间的模式所匹配到的字符串;


 或者: "|"

       a|b : a或者b

     C|cat : 表示C或者cat

   (C|c)at : 表示Cat或cat

fgrep不支持使用正则表达式

      当无需用到元字符编写模式时,使用fgrep处理数据量庞大的文本文件时,速度可以体现出来

**************************************************************************************************************************

练习:

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

                 grep -v bash$ /etc/passwd
                 egrep -v bash$ /etc/passwd

    2、找出/etc/passwd文件中的三位或四位数;

                 grep "[[:digit:]]\{3,4\}" /etc/passwd
                 egrep "[[:digit:]]{3,4}" /etc/passwd

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

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

    4、找出"netstat  -tan”命令的结果中,以‘LISTEN’后跟0或多个空白字符结尾的行;

                 netstat -tan | grep "LISTEN[[:space:]^]*" 
                 netstat -tan | egrep "LISTEN[[:space:]^]*

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

                 fdisk -l | grep "/dev/[s,h]d[[:lower:]]"
                 fdisk -l | egrep "/dev/[s,h]d[[:lower:]]"

    6、找出”ldd  /usr/bin/cat“命令的结果中文件路径;

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

    7、找出/proc/meminfo文件中,所有以大写或小写s开头的行;至少用三种方式实现;

                 grep "^s|S" /etc/meminfo
                 grep "^[sS]" /etc/meminfo
                 grep -i "^s" /etc/meminfo

    8、显示当前系统上root、centos或slackware用户的相关信息;

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

    9、echo输出一个绝对路径,使用egrep取出其基名;

                 echo /etc/passwd | egrep -o "[^/]+/?$"

   10、找出ifconfig命令结果中的1-255之间的整数;

                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为/sbin/nologin,而后找出其用户名与shell名相同的用户;

                 egrep "^([0-9a-z]+)\>.*\1$" /etc/passwd



本文出自 “11249394” 博客,请务必保留此出处http://11259394.blog.51cto.com/11249394/1748905

以上是关于grep文本过滤 / 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

Linux文本过滤搜索器grep与egrep的常用正则表达式与用法

正则和grep——再做正则就去死

正则表达式文本过滤

grep文本过滤工具与正则表达式

grep命令与正则表达式(过滤)一

第二天 linux 过滤,正则表达式