闇の光

读书笔记 经验感受

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

Grep

grep这个命令的全称为:general regular expression parser

在我们的系统中搜索文件,我们使用的命令是:find。而在文件中搜索字符串,我们所使用的命令就是:grep。当然,我们也可以将grep跟随在find命令后面的-exec选项里,这毕竟是再普通不过的了。

grep命令的语法结构如下:

grep [options] PATTERN [FILES]

如果没有给出文件名,grep将所搜标准输出中内容。

接下来让我们来了解grep的几个主要选项:

OptionMeaning
-c不输出所匹配的行,只输出所匹配的行的数目
-E开启扩展表达式
-h禁止输出搜索到的文件名的前缀
-i所要忽略的状况,比如:忽略大小写
-l列出所匹配行的文件名,但不输出实际的匹配行
-v反转匹配模式查找只显示不匹配的行

下面让我们看一些简单的grep实例:

$ grep in words.txt
When shall we three meet again. In thunder, lighting, or in rain?
I come, Graymalkin!
第一个实例没有使用选项,它只在文件words.txt中搜索含有字符串“in”的匹配行并将之输出。文件名不会被输出,因为我们所搜索的只是一个文件。

$grep -c in words.txt words2.txt
words.txt:2
words2.txt:14
这个实例的结果是只计算在两个不同的文件中所匹配的行的数目。

$grep -c -v in words.txt words2.txt
words.txt:9
words2.txt:16
而这个实例因为使用的是-v选项,因此它的结果是只计算在两个不同的文件中不匹配的行的数目。

如你所见,grep的基本用法是多么的简单易学。现在让我们来看一下基本的规则表达式,它能让我们做一些更为复杂的模式匹配。在先前的学习中,我们知道规则表达式在linux和许多其他的开源语言中都有所涉及,比如我们可以在vi编辑器中以及写perl脚本时使用规则表达式。

在规则表达式中,有些特定的字符在使用时被赋予了特殊的意思,下面让我们来看看最经常使用到的特殊字符:

CharacterMeaning
^表示一行的开头
$表示一行的结尾
.表示任意一个字符
[ ]表示在方括号中的一系列字符,比如[a-e]表示从a到e范围之间的
字符,即abcde。另外若要表示相反的字符范围,在之前使用^,
比如说表示除了abcde之外的字符:[^a-e]。

如果你想正常使用上面的字符,而不是被赋予的特殊意思的话,在该字符前加转移字符\。即假使你想使用“$”,就要这样使用:\$ 。

下面是一些在方括号中使用的特殊匹配模式,当然它们也十分的重要,而且非常有用。

Match PatternMeaning
[:alnum:]字母数字字符
[:alpha:]字母
[:ascii:]ASCII字符
[:blank:]空格或者tab
[:cntrl:]ASCII控制字符
[:digit:]数字
[:graph:]非空字符(非空格、控制字符)
[:lower:]小写字母字符
[:print:]可印刷字符
[:punct:]标点符号字符
[:sapce:]所有空白字符,包括垂直tab
[:upper:]大写字母字符
[:xdigit:]十六进制数字

另外,如果要使用-E来扩展匹配的话,字符扩展集也是要指定的。下面的表格是其他用来控制完成匹配格式的字符,当它们同grep使用时需要在之前加上字符\。

OptionMeaning
?匹配是可选择的,但最多可以被匹配一次。
*必须被匹配零次或多次
+必须被匹配一次或多次
{n}必须被匹配n次
{n,}必须被匹配n次或多次
{n,m}必须被匹配次数可以从n次到m次

下面我们来看几个例子:

1. 搜索以e结尾的行

$ grep e$ words2.txt

2. 搜索以a结尾的单词

$ grep a[[:blank:]] words2.txt

3.搜索以th开头的单词,且单词长度仅为3。

$ grep th.[[:space::]] words2.txt

4.使用grep的扩展模式搜索长度为10的小写字母单词

$ grep -E [a-z]\{10\} words2.txt


上面只是让我们了解了一下规则表达式的重要性,如果你想了解更多更深入的信息,最好的方法就是查阅linux中的相关档案,并多做练习。

posted on 2008-03-14 17:22  taizi  阅读(342)  评论(0编辑  收藏  举报