Grep

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

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

grep命令的语法结构如下:

grep [options] PATTERN [FILES]

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

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

Option

Meaning

-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脚本时使用规则表达式。

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

Character

Meaning

^

表示一行的开头

$

表示一行的结尾

.

表示任意一个字符

[ ]

表示在方括号中的一系列字符,比如[a-e]表示从a到e范围之间的

字符,即abcde。另外若要表示相反的字符范围,在之前使用^,

比如说表示除了abcde之外的字符:[^a-e]。

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

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

Match Pattern

Meaning

[:alnum:]

字母数字字符

[:alpha:]

字母

[:ascii:]

ASCII字符

[:blank:]

空格或者tab

[:cntrl:]

ASCII控制字符

[:digit:]

数字

[:graph:]

非空字符(非空格、控制字符)

[:lower:]

小写字母字符

[:print:]

可印刷字符

[:punct:]

标点符号字符

[:sapce:]

所有空白字符,包括垂直tab

[:upper:]

大写字母字符

[:xdigit:]

十六进制数字

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

Option

Meaning

?

匹配是可选择的,但最多可以被匹配一次。

*

必须被匹配零次或多次

+

必须被匹配一次或多次

{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中的相关档案,并多做练习。