基本用法
本篇介绍非常有用的命令是grep,这个不寻常的名字代表的是通用正则表达式解析器(General Regular Expression Parser,简写为grep)。你使用find命令在系统中搜索文件,而使用grep命令在文件中搜索字符串。事实上,一种非常常见的用法是在使用find命令时,将grep作为传递给-exec的一条命令。
grep命令使用一个选项、一个要匹配的模式和要搜索的文件,它的语法如下所示:
grep [options] PATTERN [FILES]
如果没有提供文件名,则grep命令将搜索标准输入。我们首先来查看grep命令的一些主要选项,它们列在了下表中,完整的选项列表请见grep命令的手册页。
实验 基本的grep命令用法
我们来看一些使用grep命令的简单例子:
lkmao@ubuntu:/big/work/ipc/caption_01$ grep bill bill.c
void bill(char* arg){
printf("bill:we passed %s\n",arg);
lkmao@ubuntu:/big/work/ipc/caption_01$ grep -c bill bill.c main.c
bill.c:2
main.c:1
lkmao@ubuntu:/big/work/ipc/caption_01$ grep -c -v bill bill.c main.c
bill.c:3
main.c:6
lkmao@ubuntu:/big/work/ipc/caption_01$ grep -n bill bill.c main.c
bill.c:3:void bill(char* arg){
bill.c:4: printf("bill:we passed %s\n",arg);
main.c:5: bill("hello world");
lkmao@ubuntu:/big/work/ipc/caption_01$
实验解析
第一个例子未使用选项,它只是在文件bill.c中搜索字符串bill,然后输出匹配的行。文件名未输出是因为你只在一个文件中进行搜索。
第二个例子在两个不同的文件中计算匹配行的数目。在这种情况下,文件名被输出。
第三个例子使用-v选项对搜索取反,在两个文件中计算不匹配行的数目。
第四个例子使用-n选项,输出匹配的文件名+行号+该行的内容。
正则表达式
正如你所看到的,grep命令的基本用法非常容易掌握。现在是时候介绍正则表达式的基础知识了,它允许你实现更复杂的匹配。正如我们在本章前面提到的那样,正则表达式被广泛应用于Linux和许多其他开源编程语言中。你可以在vi编辑器或Perl脚本中使用它们,而且不论它们出现在哪里,其基本原理都是一样的。
在正则表达式的使用过程中,一些字符是以特定方式处理的。最常使用的特殊字符如下表所示。
如果想将上述字符用作普通字符,就需要在它们前面加上\字符。例如,如果想使用$字符,你需要将它写为\$。在方括号中还可以使用一些有用的特殊匹配模式,如表2-18所示。
另外,如果指定了用于扩展匹配的-E选项,那些用于控制匹配完成的其他字符可能会遵循正则表达式的规则,见下表。对于grep命令来说,我们还需要在这些字符之前加上\字符。
这看上去有点复杂,但如果你实际应用它,将会发现它并不像第一眼看上去那么复杂。掌握正则表达式的最简单方法就是尝试一些实验。
(1)我们的第一个例子是查找以字母t结尾的行。你可能会猜到需要使用特殊字符$,如下所示:
创建一个文件words.txt,并输出下面的内容
hello world
this is a test
gulu is a dog
注意,输入完毕后,要保证行尾没有空格
$ grep t$ words.txt
this is a test
如你所见,这个命令找到了以字母t结尾的行。
(2)现在假设想要查找以字母u结尾的单词。要完成这一任务,你需要使用方括号括起的特殊匹配字符。在本例中,你将使用的是[[:blank:]],它用来测试空格或制表符:
$ grep u[[:blank:]] words.txt
gulu is a dog
(3)下面我们来查找以th开头的由4个字母组成的单词。在本例中,你既需要使用[[:space:]]来划定单词的结尾,还需要用字符(.)来匹配一个额外的字符:
$ grep th..[[:space:]] words.txt
this is a test
(4)最后,我们用扩展grep模式来搜索只有2个字符长的全部由小写字母组成的单词。我们通过指定一个匹配字母a到z的字符范围和一个重复2次的匹配来完成这一任务:
$ grep -E [[:space:]][a-z]\{2\}[[:space:]] words.txt
this is a test
gulu is a dog
我们在这里只涉及了正则表达式中最重要的内容。与Linux中大多数事物一样,系统中的大量文档可以帮助你了解更多的细节,但学习正则表达式最好的方法是实际操作。