免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1520 | 回复: 0
打印 上一主题 下一主题

在Linux下正则表达式和grep命令的使用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-26 15:07 |只看该作者 |倒序浏览
  1 什么是正规表示法:
  什么是正规表示式 ( Regular Exdivssion, 底下简称 RE ) 呢?简单的说,在 Linux 的环境下,我们可以透过『字符串以及一些特殊字符的辅助』来进行文字的比对工作,好来让使用者筛选自己所需要数据。
  这些特殊的字符与搭配使用的工具,就构成了正规表示法的主轴!
  例如 /etc/rc.d/init.d 这个目录当中好了,如果你要找到一个文件内容含有 mail 这个字符串的文件名,要怎么搜寻呢?利用 grep 配合 mail 以及万用字符来搜寻所有的文件名『grep 'mail' /etc/rc.d/init.d/*』
  2 正规表示法对于系统管理员的用途:
  对于系统管理员来说,正规表示法则是一个『不可不学的好东西!』由于系统如果在繁忙的情况之下,每天产生的讯息信息会多到你无法想象的地步,而我们也都知道,系统的『错误讯息登录文件』 的内容记载了系统产生的所有讯息,当然,这包含你的系统是否被『入侵』的纪录数据。但是系统的数据量太大了,要系统管理员的 你每天去看这么多的讯息数据,想不疯掉都很难,这个时候,我们就可以透过『正规表示法』的功能,将这些登录的信息进行处理,仅取出『错误』的信息来进行分析。
  3 正规表示法的广泛用途:
  除了系统管理员之外,一大堆的软件与设定都是支持正规表示法的,最常见的例子就是『邮件服务器』!您是否有常常收到电子邮件里最让人诟病 的『广告信件』呢?那如果我在 Server 端就将广告信件给剔除的话,客户端就会减少很多不必要的频宽损耗了对吧!那么如何剔除广告信件呢?由于广告信件几乎都有一定的标题或者是内容,因此,只要 每次有来信时,都先将来信的标题与内容进行特殊字符串的比对,使用正规表示法发现有不良信件就予以剔除!目前两大服务器软件sendmail 与 postfix 都支持正规表示法的比对功能!很多的服务器软件、以及套件都支持正规表示法。
  4 grep
  语法:[root @test /root ]# grep [-acinv] '搜寻字符串' filenames-list
  参数说明:
  -a :将 binary 文件以 text 文件的方式搜寻数据
  -c :计算找到 '搜寻字符串' 的次数
  -i :忽略大小写的不同,所以大小写视为相同
  -n :顺便输出行号
  -v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行!
  范例:
  [root @test /root]# grep 'root' /var/log/secure
  搜索 /var/log/secure 这个文件中包含 root 的行
  [root @test /root]# grep -v 'root' /var/log/secure
  搜索没有 root 的行
  [root @test /root]# grep [A-Z]ANPATH /etc/man.config
  说明:grep 是一个很常见的指令,最重要的功能就是进行字符串数据的比对了,需要说明的是『grep 在一个文件中查寻一个字符串时,他是以"整行"为单位来数据的撷取的!』
  grep 是最简单的正规表示法搜寻指令之一,他并不支持一些更严谨的正规表示法内容,不过,已经相当的好用。
  例题一:找出这个文件里面含有 know 这个字符,并将行号列出来:注意,大小写是不一样的
  [root @test /root ]# grep -n 'know' regexp.txt
  例题二:找出这个文件里面含有 * 这个字符,并将行号列出来:
  [root @test /root ]# grep -n '\*' regexp.txt
  例题三:我要将所有 know 不论大小写都列出来,并列出行号:
  [root @test /root]# grep -ni 'know' regexp.txt
  注意:类似的指令还有egrep、awk、gawk、sed等,将在后面详细说明
  5 正规表示法的特殊字符(charaters)与 egrep 指令
  特殊字符 表示意义
  ^word 待搜寻的字符在行首
  word$ 待搜寻的字符在行尾
  . 匹配任何一个可能的字符
  \ 跳脱符号将特殊字符变成普通字符
  ? 任何一个『单一』字符
  * 匹配模式中重复的字符
  
    列表中的字符
      [range] 列表中范围内的字符
      [^list] 反向选择,与
      相反
        [^range] 反向选择,与 [range]相反
        \{n\} 与前一个相同字浮连续 n 个
        \{n,m\} 与前一个相同字浮连续 n-m 个
        请特别留意的是,『正规表示法的特殊字符』与一般在指令列输入指令的『万用字符』并不相同,例如,在万用字符当中, * 代表的是 0 ~ 无限多个字符的意思,但是在正规表示法当中, * 则是重复前一个字符的意思~使用的意义并不相同,不要搞混了!
        例题:在 /etc 底下,只要含有 XYZ 三个字符的任何一个字符的那一行就列出来
        grep [XYZ] /etc/*
        例题:我想要知道在 /etc 里面,只要句首是 w-z 的就将他印出来?
        grep ^[w-z] /etc/*
        6 diff比较两个文件内容是否有不一致的指令!
        语法:[root @test /root ]# diff file1 file2
        范例:[root @test /root]# diff index.htm index.html
        例子:ls –l   grep ‘^d’ 查询子目录
        注意:使用规则表达式要养成良好的习惯,就是在匹配模式的两端加上‘’。这样和shell的文件通配符号做区别
        7 充分规则表达式专用字符
        符号 执行
        pattern1   pattern2 逻辑或
        (patten) 对模式进行分组
        char+ 搜索前面字符的一个或者多个重复实例
        char? 搜索前面字符的一个或者0个实例
        例题:t+ 匹配一个或一个以上连续的t,如t tt ttt
        t? 匹配0个或1个t 如 t 或 ‘ ’
        “create   stream “ 和两种模式的任一种进行匹配
        重点回顾
        • shell文件匹配字符和规则表达式的区别
        shell文件匹配字符是用于匹配文件名
        正规表示法RE的用途主要是用来做为『搜寻』字符串之用,匹配的文件里面的内容和用来过滤特殊讯息等用途;
        • 由于严谨度的不同,正规表示法之上还有更严谨的延伸正规表示法;
        • 正规表示法的处理方式,经常是以『整行』或称为『整段』来进行处理的;
        • grep 与 egrep 在正规表示法里面是很常见的两支程序,其中, egrep 可以用不同的模式去匹配,以及支持更严谨的正规表示法的语法。

          举例二则:
          1)grep -v ^# /etc/vsftpd/vsftpd.conf
          ^#表示查找以“#”开头的,加上-v参数表示取反,即查找不是以“#”开头的。
          2)grep '^[^#]' /etc/vsftpd/vsftpd.conf
          []表示一个范围,所有在这个范围内的都符合条件,
          [#]这是一个范围只有一个字母“#”,
          [^#]表示除“#”以外的所有,
          ^[^#]表示非#开头的。
          上述两条命令均是过滤以“#”开头的注释,方便查看已经配置的信息,但二者略有不同,配置文件若有空行,第一条命令仍然能够输出空行。


      本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/15605/showart_2037692.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP