Chinaunix首页 | 论坛 | 博客
  • 博客访问: 68827
  • 博文数量: 30
  • 博客积分: 1265
  • 博客等级: 中尉
  • 技术积分: 295
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-04 15:24
文章分类

全部博文(30)

文章存档

2011年(1)

2010年(14)

2009年(11)

2008年(4)

我的朋友

分类: LINUX

2010-04-05 23:49:29

1. Grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的Grep家族包括Grep、 eGrep和fGrep。eGrep和fGrep的命令只跟Grep有很小不同。eGrep是Grep的扩展,支持更多的re元字符, fGrep就是 fixed Grep或fast Grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux 使用GNU版本的Grep。它功能更强,可以通过-G、-E、-F命令行选项来使用eGrep和fGrep的功能。
  Grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。
  Grep可用于shell脚本,因为Grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。
2. Grep正则表达式元字符集(基本集)
  锚定行的开始 如:’^Grep’匹配所有以Grep开头的行。
  $
  锚定行的结束 如:’Grep$’匹配所有以Grep结尾的行。
  匹配一个非换行符的字符 如:’gr.p’匹配gr后接一个任意字符,然后是p。
  *
  匹配零个或多个先前字符 如:’*Grep’匹配所有一个或多个空格后紧跟Grep的行。 .*一起用代表任意字符。
  []
  匹配一个指定范围内的字符,如’[Gg]rep’匹配Grep和Grep。
  [^]
  匹配一个不在指定范围内的字符,如:’[^A-FH-Z]rep’匹配不包含A-R和T-Z的一个字母开头,紧跟rep的行。
  \(..\)
  标记匹配字符,如’\(love\)’,love被标记为1。
  \ <
  锚定单词的开始,如:'\\ >
  锚定单词的结束,如’Grep\ >’匹配包含以Grep结尾的单词的行。
  x\{m\}
  重复字符x,m次,如:’0\{5\}’匹配包含5个o的行。
  x\{m,\}
  重复字符x,至少m次,如:’o\{5,\}’匹配至少有5个o的行。
  x\{m,n\}
  重复字符x,至少m次,不多于n次,如:’o\{5,10\}’匹配5–10个o的行。
  \w
  匹配文字和数字字符,也就是[A-Za-z0-9],如:’G\w*p’匹配以G后跟零个或多个文字或数字字符,然后是p。
  \W
  \w的反置形式,匹配一个或多个非单词字符,如点号句号等。
  \b
  单词锁定符,如: ‘\bGrepb\’只匹配Grep。
3. 用于eGrep和 Grep -E的元字符扩展集
  +
  匹配一个或多个先前的字符。如:’[a-z]+able’,匹配一个或多个小写字母后跟able的串,如loveable,enable,disable等。
  ?
  匹配零个或多个先前的字符。如:’gr?p’匹配gr后跟一个或没有字符,然后是p的行。
  a|b|c
  匹配a或b或c。如:Grep|sed匹配Grep或sed
  ()
  分组符号,如:love(able|rs)ov+匹配loveable或lovers,匹配一个或多个ov。
  x{m},x{m,},x{m,n}
  作用同x\{m\},x\{m,\},x\{m,n\}
4. grep常用的一些参数:
     -c   统计匹配的行数
     -l    打印匹配所在的文件
     -L  搜索多个文件时,打印不匹配所在的文件
     -n   打印匹配的所在的行号
     -A n   输出匹配的后n行
     -B n   输出匹配的前n行   当-A -B 后n相同时,可合写,如 -1 表示输出匹配行的上下1行
     -o    仅输出匹配模式
     -h    当搜索多个文件时,不显示匹配文件名前缀
     -E    当用到+、?\{n\}、\{n,\}、\{n,m\}正则时,需加-E
     -w    仅匹配单词,相当于^word$  或\
     -i  匹配时忽略大小写
     -s  不显示关于不存在或者无法读取文件的错误信息
     -v   反检索,只显示不匹配的行
     -r  搜索时,搜索子目录
     -d  搜索时,忽略子目录
5 grep查找实例
     1).使用grep显示出/usr/share/dict/words文件中,例如显示出所有含有fish的行:
          grep 'fish' /usr/share/dict/words
     2).使用grep显示出/usr/share/dict/words文件中,输出任何包含fish的所有行,还要输出紧接着这行的上下各两行的内容:
          grep -1 'fish' /usr/share/dict/words
          grep -A 1 -B 1 'fish' /usr/share/dict/words
     3). 使用grep显示出/usr/share/dict/words文件中,来显示出在words文件中有多少行含有fish。
          grep -c 'fish' /usr/share/dict/words
     4).使用grep显示出/usr/share/dict/words文件中,显示出那些行含有fish,并将行号一块输出,看一看starfish在哪行
          grep -n 'fish' /usr/share/dict/words|grep -w 'starfish'
     5).想列出/usr/share/dict/words中包含先有字母t然后有一个元音字母,之后是sh的单词,命令为
          grep 't[aeiou]sh' /usr/share/dict/words
     6).在/usr/share/dict/words文件中,创建可以符合abominable,abominate,anomie和atomize的正则表达式,但是不要选到别的单词
         grep -E '^a[bnt]omi(nabl|nat|z)?e$'  /usr/share/dict/words
     7).在/usr/share/dict/words文件中包含多少先有字母t然后有一个元音字母,之后是sh的单词,只输出数量
         grep -c 't[aeiou]sh'/usr/share/dict/words
     8).列出/usr/share/dict/words中刚好包含16个字母的单词
         grep -E '^[a-Z]{16}$' /usr/share/dict/words
         awk '{if(length($NF)==16) print $1}' /usr/share/dict/words |grep -v '-'
     9).我们将要使用/usr/share/doc文件夹来完成我们的下几个任务列出/usr/share/doc/bash-* 文件夹中,所有包含单词expansion的文件
         grep -wrl "expansion" /usr/share/doc/bash-3.2
     10).显示出“Linux”在/usr/share/doc/bash-2.05b文件夹的文件中出现的次数
         grep -wro 'Linux' /usr/share/doc/bash-3.20|uniq -c

阅读(1872) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~