Chinaunix首页 | 论坛 | 博客
  • 博客访问: 979903
  • 博文数量: 184
  • 博客积分: 10030
  • 博客等级: 上将
  • 技术积分: 1532
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-27 18:32
文章分类

全部博文(184)

文章存档

2009年(1)

2008年(63)

2007年(39)

2006年(79)

2005年(2)

我的朋友

分类: LINUX

2006-10-09 16:26:45

chaper 10
 
GREP 是 Global Regular Expression Print 的缩写
对于标准输入的每一行,grep执行以下的操作:
(1) 把下一输入行复制到模式空间中. 模式空间是只可保存一个文本行的缓冲区.
(2) 对模式空间应用正则表达式.
(3) 如果有匹配存在,该行从模式空间中被复制到标准输出.
grep实用程序对输入的每行重复这三个操作步骤.
 
注意grep处理下列情况的方式:
1.grep是一个搜索程序,它只能搜索匹配一个正则表达式的一行的存在性.
2.grep可以对一行采取唯一的动作是把它发送到标准输出. 如果该行不匹配正则表达式,则其不被打印.
3.行的选择只基于正则表达式. 行编号或其他准则不能用于选择行.
4.grep是一个过滤器. 它可用在管道的左边或右边.
5.grep不能用于增加,删除或修改行.
6.grep不能用于只打印行的一部分.
7.grep不能只读取文件的一部分.
8.grep不能基于前面的内容或下一行来选择一行.只有一个缓冲区,它只保存当前行.
 
GREP家族包括: grep,fgrep,egrep
fgrep:只支持字符串模式,不支持正则表达式.
 grep:只支持数量有限的正则表达式.
egrep:支持大多数的正则表达式,但不是全部.
 
grep家族的选项:
-b   在每一行前加上所在文件块的编号
-c   只打印匹配模式的行编号记数
-i   在匹配文本时忽略大小写
-l   打印至少有一行匹配模式的文件列表
-n   在每行前显示其行编号
-s   哑模式. 执行其功能,但抑制所有输出
-v   逆向输出. 打印不匹配模式的行
-x   只打印完全匹配模式的行
-f file 要匹配的字符串列表在文件file中
 
grep实用程序中的表达式往往比较复杂,经常把几个原子和或运算符结合到一个大的表达式中.当运算符和原子被结合时,它们通常被包括在单引号或双引号内.从技术上讲,引号只有在使用空格或其他对grep有特殊意义的字符时才是必须的,但我们推荐您经常使用它们.
例如:
$grep 'Forouzan,*Behrouz' file
 
grep:可处理大部分正则表达式.它是家族中其它两个成员的折中,允许使用正则表达式,通常比fgrep慢.在不需要对表达式分组或使用重复来匹配模式的一次或多次出现的情况下应该使用它.它是grep家族中唯一允许保存匹配结果以待后用的成员.例如:
$grep -n ";$" file | head -5
grep找出以;结尾的所有行,然后将结果送到管道输出到head,并打印前5行. -n选项请求最初文件中的行编号被包含在输出中.编号出现在每行的开头.
 
fgrep:如果搜索规则只需要序列表达式,则fgrep是最好的实用程序.因为它的表达式只有序列运算符组成,如果您搜索与正则表达式运算符一样的文本字符,如转义符,圆括号,或引号,它使用起来是最容易的.例如:
$fgrep -n "'" file
抽出包含'的file中的所有行,-n请求打印行编号
 
egrep:是三种grep实用程序中功能最强大的.虽然它没有保存选项,但它允许更复杂的模式.例如:
$egrep -n '^[A-Z].*!$' file
抽取以大写字母开头的,以惊叹号!结尾的所有行.
$egrep -n '^[A-Z].*!.$' file
抽取以大写字母开头的,惊叹号!在倒数第2个位置的所有行.
$egrep -n '^[A-Z].*!..$' file
抽取以大写字母开头的,惊叹号!在倒数第3个位置的所有行.
下面把头两个模式结合到一起.用替换运算符(|)可以很容易的实现,把它放到两个模式的中间.
(pattern-A)|(pattern-B)
$egrep '(^[A-Z].*!$)|(^[A-Z].*!.$)' file
注意,在用替换运算符结合模式时,通过在表达式外加圆括号,将每个表达式分组.
现在加入第三个模式:
$egrep '(^[A-Z].*!$)|(^[A-Z].*!.$)|(^[A-Z].*!..$)' file
它由三个用替换运算符分隔的组模式组成.
 
示例:
例1:
$egrep '^...$' file
从文件中选择那些只有三个字符的行
例2:
$egrep '...' file
从文件中选择那些至少由三个字符的行.
例3:
$egrep -vn '....' file
从文件中选择那些有三个或少于三个字符的行.这个例子中的模式为四个点运算符.它匹配至少有四个字符的所有行.但这里想要的时那些有三个或少于三个的行;也就是说,我们要逆向该模式---所有不匹配该模式的行.可使用UNIX命令里的(-v)实现此功能.因为有些行是空格,我们也要在输出中包含显示行编号的的选项(-n).
 
例4:
$egrep -c '^$' file
计算文件中的空行的数目,使用记数选项(-c).
例5:
$egrep -c '.' file
通过匹配至少含一个字符的行选择所有非空行(.),然后使用记数选项(-c).
 
例6:
$fgrep 'UNIX' file
从文件中选择包含UNIX的行.
 
例7:
$egrep '^UNIX$' file
选择文件中只包含UNIX的行.
 
例8:
$egrep 'UNXI.*UNIX' file
从文件中选择至少包含模式UNIX两次的行.
 
例9:
$egrep -v '^$' file
将文件复制到显示器,但要删除空行. 这是另一个逆取的例子.
 
例10:
$egrep '[0-9][0-9]' file
从文件中选择至少有两个数字,并且它们之间没有任何其他字符的行.
 
例11:
$egrep '^ *A' file   
linux下测试未通过
centos4.3
egrep (GNU grep) 2.5.1
GNU bash, version 3.00.15(1)-release
 
 
从文件中选择第一个非空字符为A的行,这个例子从行首(^)开始,查找0个或多个空格( *).结果是跳过任何前导空格字符.如果有,则执行为空.表达式中下一个字符是字母A.如果当前字符是A,则匹配;如果不是,则该行不匹配表达式.被跳过.
 
例12:
$egrep -n '^[^A-G]' file
从文件中选择不以A到G开头的行.这个例子中,我们在一个类原子中使用了取余运算符(^)来指定A到G的范围.
 
例13:
$ who | grep'John'
找出John当前是否登陆系统
 
例14:
$egrep -l "Raven" *
找出当前目录下的所有文件名包含"Raven"的文件.
 
 
 
阅读(2063) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~