文章目录
- 一、命令介绍
- grep
- egrep
- fgrep
- 二、正则表达式元字符扩展集
- 三、POSIX 字符集
一、命令介绍
grep
一种强大的文本搜索工具,用于在文件内查找指定的字符串,在不使用转义符的前提下支持基本的正则表达式来搜索文本,并把匹配的行打印出来。
Linux 使用 GNU 版本的 grep
。它可以通过 -G
、-E
、-F
等选项来使用 egrep
和 fgrep
的功能。
grep
的工作方式是这样的,它在一个或多个文件中搜索模板(pattern
)。如果模板包括空格,则必须使用双引号将其包裹起来,模板后的所有字符串被看作文件名。
grep
可用于 shell
脚本,因为 grep
通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回 0
,如果搜索不成功,则返回 1
,如果搜索的文件不存在,则返回 2
。我们利用这些返回值就可进行一些自动化的文本处理工作。
egrep
egrep
,称为扩展的 grep
命令,其实和 grep -E
等价,支持基本和扩展的正则表达式,使用的语法及参数可参照 grep
指令,与 grep
的不同点在于解读字符串的方法。egrep
是用 extended regular expression
语法来解读的,而 grep
则用 basic regular expression
语法解读,extended regular expression
比 basic regular expression
的表达更规范。
fgrep
fgrep
就是 fixed grep
或 fast grep
,等同于 grep -F
。它把所有的字符都看作普通字符,也就是说,正则表达式中的元字符全部按字符原义解释。
fgrep
命令搜索字符串而不是搜索匹配表达式的模式。它利用固定的字符串来对文本进行搜索,但不支持正则表达式的引用,所以此命令的执行速度也最快。
二、正则表达式元字符扩展集
在扩展的正则表达中把写成 \(\)
写成 ()
、\{ \}
写成 {}
,加入了 +
限定符,表示匹配其前面的元素至少出现一次,无上限;加入了 ?
限定符,表示匹配其前面的元素 0 个或者 1 个;新增了或符号 |
,表示或者的意思。基本正则表达式使用 ()
、{}
、+
、?
、|
都需要加 \
进行转义,在扩展正则表达中不需要。
扩展的元字符 | 解释 |
---|---|
+ | 匹配一个或多个前面的元素。如:[a-z]+able ,表示匹配一个或多个小写字母后跟着 able 的串,如 loveable 、enable 、disable 、aable 等。在 grep 的 pattern 中需要转义,写成 \+ |
? | 匹配零个或 1 个前面的元素。如:gr?p ,表示匹配 gp 或者 grp ,即字符 r 可有可无 |
| | 代表或者的意思。如:a|b|c 表示匹配 a 或 b 或 c ;如:grep|sed 表示匹配 grep 或 sed 。在 grep 中需要转义,写成 \| ,或者通过选项 -E 来实现,如:grep -E 'c|cat' filename ,表示在文件 filename 内查找 c 或者 cat ,而 egrep 直接写成:egrep 'c|cat' filename 。 |
() | 分组符号,如:love(able|rs) ,表示匹配 loveable 或 lovers ;如:(ov)+ ,表示匹配一个或多个 ov ,即匹配至少一个 ov 。在 grep 中需要使用转义符,写成 \(\) |
{m,n} | 匹配其前面的元素 m 到 n 次 。在 grep 中直接使用区间量词,需要转义,写成:\{m,n\} |
三、POSIX 字符集
为了在不同国家的字符编码中保持一致,POSIX(The Portable Operating System Interface)
增加了特殊的字符类,如 [:alnum:]
是 A-Za-z0-9
的另一个写法。要把它们放到 []
号内才能成为正则表达式,如:[A- Za-z0-9]
等价于 [[:alnum:]]
。除了 fgrep
,grep
和 egrep
都支持 POSIX 字符集。
字符表达式 | 说明 |
---|---|
[[:alnum:]] | 文字数字字符 |
[[:alpha:]] | 文字字符 |
[[:digit:]] | 数字字符 |
[[:graph:]] | 非空字符(非空格,控制字符) |
[[:lower:]] | 小写字符 |
[[:cntrl:]] | 控制字符 |
[[:print:]] | 非空字符(包括空格) |
[[:punct:]] | 标点符号 |
[[:space:]] | 所有空白字符(新行,空格,制表符) |
[[:upper:]] | 大写字符 |
[[:xdigit:]] | 十六制数字(0-9,a-f,A-F) |
注:如果在英语系的国家中,上述的文字字符就是指英文字母。另外POSIX 字符集可以参考《正则表达式详解》中的 POSIX 字符集章节。