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!
$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
如你所见,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中的相关档案,并多做练习。