虽然grep是一个着名的Linux命令(我们已经详细介绍了它),你知道这个工具有两种不同的变体吗? 是的,这些是egrep和fgrep 。 在本教程中,我们将使用简单易懂的示例来讨论后者(fgrep)。 但在我们这样做之前,值得一提的是,本教程中提到的所有示例和说明都已在Ubuntu 16.04LTS上进行了测试。
Linux fgrep命令
如果您看官方文档,grep命令的手册页面说,fgrep只不过是grep -F。 它还说,像fgrep和egrep这样的变体只能用于向后兼容。 稍后我们将在本教程中介绍这些细节。
同时,这里是fgrep的语法(与grep相同):
grep [OPTIONS] PATTERN [FILE...]
以下是grep命令手册页面如何解释该工具:
grep searches the named input FILEs for lines containing a match to the given PATTERN. If no files
are specified, or if the file “-” is given, grep searches standard input. By default, grep prints
the matching lines.
以下Q&A风格的示例应该让您更好地了解fgrep的工作原理。
Q1。 fgrep与grep和egrep有什么不同?
fgrep命令与grep和egrep不同之处在于,它将PATTERN解释为由换行符分隔的固定字符串(而不是正则表达式)的列表。
由于它被认为与grep -F相同,所以专家们在StackExchange中解释了grep的-F选项:
The-F
switch switches grep into a different mode where it accepts a pattern to match, but then
splits that pattern up into one search string per line and does an OR search on any of the strings
without doing any special pattern matching.
Q2。 如何使用fgrep?
要了解fgrep的用法,我们先来一个基本的例子。 假设有一个文件(file1)包含以下内容:
还有另一个文件(words.txt),其中包含我们要在file1中搜索的单词列表。
所以这里是如何使用fgrep来执行这个搜索:
fgrep -f words.txt file1
所以你可以看到被发现的单词用红色突出显示。 现在有些人可能会认为这是grep和egrep在这种情况下也会做的,那么fgrep如何不同呢?
首先,是的,你是对的。 grep和egrep命令也将产生类似的输出:
但是,如果file1和word.txt包含以下内容(在单词中观察特殊字符),差异将会很明显:
在这里,egrep和grep将找不到所有单词:
但是,fgrep将按照预期的方式工作:
Q3。 fgrep和grep之间真的没有区别吗?
通过官方文档,fgrep和grep -F命令没有任何区别。 然而,据报道,这两种工具之间有一个主要区别:它们使用的字符串匹配算法。 而fgrep使用Aho-Corasick算法,grep使用了Commentz-Walter的修改版本 。
“ 这意味着, grep
在O(mn)的复杂性上是最差的,而fgrep
最差的是O(m + n) ,”StackExchange论坛的专家说。
结论
很明显,fgrep命令不难理解和使用。 至于fgrep和grep -F之间的区别,虽然我们在第三季度已经注意到了,但我们认为这个问题不应该打扰大部分用户。 如果您有疑问或有fgrep相关的查询,请通过在下面留下评论与我们分享。