新闻 | 天津 | 民生 | 广电 | 津抖云 | 微视 | 读图 | 文娱 | 体育 | 图事 | 理论 | 志愿 | 专题 | 工作室 | 不良信息举报
教育 | 健康 | 财经 | 地产 | 天津通 | 旅游 | 时尚 | 购物 | 汽车 | IT | 亲子 | 会计 | 访谈 | 场景秀 | 发布系统

"津云"客户端
  您当前的位置 :北方网 > IT浪潮 > 滚动新闻 正文
关键词:

Linux下正则表达式和grep命令的使用


http://www.enorth.com.cn  2007-09-20 17:48

  正规表示法( Regular Exdivssion,RE )

  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$待搜寻的字符在行尾

  .匹配任何一个可能的字符

  \跳脱符号将特殊字符变成普通字符

  ?任何一个『单一』字符

  *匹配模式中重复的字符

  [list]列表中的字符

  [range]列表中范围内的字符

  [^list]反向选择,与[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可以用不同的模式去匹配,以及支持更严谨的正规表示法的语法。

编辑: 赵海涛 互联网
[进入IT论坛]
请您文明上网、理性发言并遵守相关规定,在注册后发表评论。
 北方网精彩内容推荐
无标题文档
天津民生资讯
天气交通 天津福彩 每月影讯 二手市场
空气质量 天津股票 广播节目 二手房源
失物招领 股市大擂台 天视节目 每日房价
热点专题
北京奥运圣火传递和谐之旅 迎奥运 讲文明 树新风
解放思想 干事创业 科学发展 同在一方热土 共建美好家园
2008天津夏季达沃斯论坛 《今日股市观察》视频
北方网网络相声频道在线收听 2008高考招生简章 复习冲刺
天津自然博物馆馆藏精品展示 2008年天津中考问题解答
带你了解08春夏服饰流行趋势 完美塑身 舞动肚皮舞(视频)
C-NCAP碰撞试验—雪佛兰景程 特殊时期善待自己 孕期检查
热点新闻排行 财经 体育 娱乐 汽车 IT 时尚 健康 教育

Copyright (C) 2000-2026 Enorth.com.cn, Tianjin ENORTH NETNEWS Co.,LTD.All rights reserved
本网站由天津北方网版权所有