第十节
grep
grep表示全局正则表达式打印(global regular expression print)。用来对输入文件中匹配指定正则表达式的所有行进行搜索,并将之写入标准输出文件。
一、 操作
要编写操作正确的脚本,必须要理解grep实用程序的工作方式。对标准输入的每一行,grep执行如下操作:
a. 把下一输入行复制到模式空间中。模式空间是指可保存一个文本行的缓冲区。
b. 对模式空间应用正则表达式
c. 如果有匹配存在,该行从模式空间被复制到标准输出。
Grep实用程序对输入的每一行重复这三个步骤
1. grep流程图
2. grep操作示例
Ø grep是一个搜索实用程序:它只能搜索匹配一个正则表达式的一行的存在性。
Ø grep可以对一行采取的唯一动作是把它发送到标准输出。如该行不匹配,则不打印。
Ø 行的选择只基于正则表达式。行编号或其他准则不能用于选择行。
Ø grep是一个过滤器,它可被用在一个管道的左边或右边。
除了上面列出的几点,下面的grep限制也必须时刻牢记:
Ø grep不能用于增加、删除和修改行
Ø grep不能用于只打印行的一部分
Ø grep不能只读文件的一部分
Ø grep不能基于前面的内容或下一行来选择一行。只有一个缓冲区,只保留当前行。
二、 grep家族
在grep家族中有三个实用程序:grep、egrep和fgrep。
grep:只支持数量有限的正则表达式。
fgrep:支持字符串模式,不支持正则表达式
egrep:支持大多数正则表达式,但不是全部
1. grep家族选项
|
选项 |
解释 |
|
-b |
在每行前加上所在文件块编号 |
|
-c |
只打印匹配模式的行编号计数 |
|
-i |
在匹配文本时忽略大小写 |
|
-l |
打印至少有一行匹配模式的文件列表 |
|
-n |
在每行前显示其行号 |
|
-s |
哑模式。执行其功能,但抑制所有的输出 |
|
-v |
逆向输出。打印不匹配模式的行 |
|
-x |
只打印完全匹配模式的行 |
|
-f file |
要匹配的字符串列表在文件file中 |
2. grep家族表达式
|
原子 |
grep |
fgrep |
egrep |
操作符 |
grep |
fgrep |
egrep |
|
字符 |
√ |
√ |
√ |
序列 |
√ |
√ |
√ |
|
点 |
√ |
|
√ |
重复 |
除了?都可以 |
|
*?+ |
|
类 |
√ |
|
√ |
替换 |
|
|
√ |
|
锚 |
√ |
|
^$ |
组 |
|
|
√ |
|
先后引用 |
√ |
|
|
保存 |
√ |
|
|
grep实用程序中的表达式往往很复杂,经常把几个原子和/或运算符结合到一个大的表达式中。当运算符和原子被结合时,它们通常被括在单引号或双引号内。从技术角度讲,引号只有在使用空格或其他对grep有特殊意义的字符时才是必须的。
3. grep
文件匹配的最初实用程序grep可处理大部分正则表达式。再不需要对表达式分组或使用重复来匹配的情况下影使用它。它是grep家族唯一允许保存匹配结果以待后用的成员。
4. 快速grep
如果搜索规则只需要序列表达式,则快速grep是最好的选择。
5. 扩展grep
扩展grep是三种grep实用程序中功能最强大的。虽然没有保存选项,但它允许更复杂的模式。