Linux查找文件内容和字符串之grep与egrep的区别

1. 前言
grep (global search regular expression_r(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 。我们利用这些返回值就可进行一些自动化的文本处理工作 。
除了grep , 还有以下文本查找工具:
egrep (extended grep) egrep是grep的扩展 , 支持更多的re正则表达式元字符,等同于grep -E 。
fgrep (fixed grep) 就是fixed grep或fast grep , 它们把所有的字母都看作单词 , 也就是说 , 正则表达式中的元字符表示回其自身的字面意义 , 不再特殊,等同于grep -F,相对于grep和egrep的执行速度最快 。
在使用这些工具时 , 我们需要有一些基本的shell功底和熟悉正则表达式:
正则表达式 , 又称正规表示法、常规表示法(英语:Regular Expression , 在代码中常简写为regex、regexp或RE) , 计算机科学的一个概念 。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串 。在很多文本编辑器里 , 正则表达式通常被用来检索、替换那些符合某个模式的文本 。
所谓元字符就是指那些在正则表达式中具有特殊意义的专用字符 , 可以用来规定其前导字符(即位于元字符前面的字符)在目标对象中的出现模式 。
转义字符是这样一个字符 , 标志着在一个字符序列中出现在它之后的后续几个字符采取一种替代解释 。转义字符是元字符(en:metacharacter)的一种特殊情况 。通常 , 判定某字符是否为转义字符由上下文确定 。转义字符即标志着转义序列开始的那个字符 。
转义字符的英文为Escape character 。原本是指ASCII中的十进制27 , 十六进制1D , 八进制033所定义的那个字符 。对应于标准键盘左上角的ESC键 。老式键盘如果没有ESC键 , 替代输入是“Ctrl+[” 。在老式的计算机外设控制协议 , ASCII码的十进制27这个字符开始的一个字符序列 , 是外设的控制序列 , 不能按照这些字符的字面意义解释 。后来 , 就把最初的狭义的Escape character的含义引申开来 , 在各种计算机语言与协议中 , 标志着一个转义序列开始的那个字符 , 都叫做Escape character 。最常见的一个例子是C程序设计语言中 , 用反斜线字符“”作为转义字符 , 来表示那些不可打印的ASCII控制符 。在URI协议中 , 转义字符是百分号“%” 。
 
2. grep命令选项
-?
同时显示匹配行上下的?行 , 如:grep -2 pattern filename同时显示匹配行的上下2行 。
-b , --byte-offset
打印匹配行前面打印该行所在的块号码 。
-c,--count
只打印匹配的行数 , 不显示匹配的内容 。
-f File , --file=File
从文件中提取模板 。空文件中包含0个模板 , 所以什么都不匹配 。
-h , --no-filename
当搜索多个文件时 , 不显示匹配文件名前缀 。
-i , --ignore-case
忽略大小写差别 。
-q , --quiet
取消显示 , 只返回退出状态 。0则表示找到了匹配的行 。
-l , --files-with-matches
打印匹配模板的文件清单 。
-L , --files-without-match
打印不匹配模板的文件清单 。


推荐阅读