Bash 高效搜索文本文件中的多个字符串

Bash 高效搜索文本文件中的多个字符串,bash,grep,processing-efficiency,Bash,Grep,Processing Efficiency,我使用egrep在一个很长的文件(100万行)中查找几个字符串的精确匹配: egrep“\\\”我的文件 但即使只找到两个字符串也要花费太多时间。它似乎会沿着文件的总行查找每个字符串,即使它找到了一个匹配项。 事实上,我知道该文件只包含每个字符串的一次出现。 然后,我想知道,一旦egrep发现某个字符串出现并查找列表中的下一个字符串,该如何强制egrep停止查找该字符串。或者如果有其他有效的方法 谢谢。我不确定,但也许这个更快: grep -e '<pattern1>' -e '&

我使用egrep在一个很长的文件(100万行)中查找几个字符串的精确匹配:

egrep“\\\”我的文件
但即使只找到两个字符串也要花费太多时间。它似乎会沿着文件的总行查找每个字符串,即使它找到了一个匹配项。 事实上,我知道该文件只包含每个字符串的一次出现。 然后,我想知道,一旦egrep发现某个字符串出现并查找列表中的下一个字符串,该如何强制egrep停止查找该字符串。或者如果有其他有效的方法


谢谢。

我不确定,但也许这个更快:

grep -e '<pattern1>' -e '<pattern2>' -e '<pattern3>' your_file
grep-e'-e'-e''您的\u文件

-F
也可以加快速度,我认为您的模式不是真正的模式。另外,我认为如果您的输出是彩色的,grep别无选择,只能查找所有图案。

我不确定,但这一个可能更快:

grep -e '<pattern1>' -e '<pattern2>' -e '<pattern3>' your_file
grep-e'-e'-e''您的\u文件

-F
也可以加快速度,我认为您的模式不是真正的模式。另外,我认为如果输出是彩色的,grep别无选择,只能查找所有模式。

-m
选项限制匹配的数量:

-m NUM, --max-count=NUM
     Stop reading a file after NUM matching lines.
但是,您不能将它直接用于复杂的模式,因为这样,所有子模式只能得到一行。您可以做的是在子模式上循环调用
fgrep-m1

for pat in $patterns; do
    fgrep -m 1 $pat my_file
done

另一个选项是使用复杂模式,并指定与子模式数相等的匹配数,但这将导致每个文件行的比较较慢。

有一个
-m
选项限制匹配数:

-m NUM, --max-count=NUM
     Stop reading a file after NUM matching lines.
但是,您不能将它直接用于复杂的模式,因为这样,所有子模式只能得到一行。您可以做的是在子模式上循环调用
fgrep-m1

for pat in $patterns; do
    fgrep -m 1 $pat my_file
done

另外,另一种选择是使用复杂模式,并指定与子模式数相等的匹配数,但这会导致每个文件行的比较速度变慢。

如何优化搜索取决于grep实现使用的算法。egrep的“传统”算法是将模式编译成确定性有限自动机。如果您不知道这是什么,请不要担心:重要的是编译需要一点时间,但一旦编译完成,它会非常快,而且它的速度并不取决于它所寻找的模式的复杂性。事实上,一旦编译完成,egrep实际上比fgrep快——这意味着fgrep在小文件上是最快的,而egrep在大文件上是最快的

至少,这是[ef]grep的传统实现的情况。我认为大多数现代实现都是自适应的,并且会根据情况切换算法(例如,我认为现代FGREP会切换到编译DFA模式,以获得足够大的文件)。为了找出实现的最快速度,您确实需要尝试一些定时实验


不过,我可以给您一些建议:首先,避免多次运行搜索(例如,为每个单词运行fgrep),因为这意味着要多次扫描文件。第二,不要担心最小化它搜索的字符串数量,因为如果你处于最佳模式,那也无所谓。第三,使用@Lev对
-m
的建议,在找到它需要的内容后让它停止(尽管我很确定这两个词都将使用
-m2
)。

如何优化搜索取决于grep实现使用的算法。egrep的“传统”算法是将模式编译成确定性有限自动机。如果您不知道这是什么,请不要担心:重要的是编译需要一点时间,但一旦编译完成,它会非常快,而且它的速度并不取决于它所寻找的模式的复杂性。事实上,一旦编译完成,egrep实际上比fgrep快——这意味着fgrep在小文件上是最快的,而egrep在大文件上是最快的

至少,这是[ef]grep的传统实现的情况。我认为大多数现代实现都是自适应的,并且会根据情况切换算法(例如,我认为现代FGREP会切换到编译DFA模式,以获得足够大的文件)。为了找出实现的最快速度,您确实需要尝试一些定时实验


不过,我可以给您一些建议:首先,避免多次运行搜索(例如,为每个单词运行fgrep),因为这意味着要多次扫描文件。第二,不要担心最小化它搜索的字符串数量,因为如果你处于最佳模式,那也无所谓。第三,使用@Lev建议的
-m
在找到它需要的内容后停止(尽管我很确定使用
-m2
将对这两个单词进行单次搜索)。

我将单词模式替换为字符串,这样更好:)我必须使用egrep,因为我避免循环抛出包含搜索字符串的数组。然后我就用参数expension来得到我写的。最后使用egrep找到这些。我仍然不确定为什么需要
egrep
。它是如何比grep-F-e'string1'-e'string2'-e'string3'更好呢。你试过了吗,顺便说一句?是的,正如Lev所建议的,在这个命令行中添加
-m2
也会有所改进,我一开始没有意识到每个模式只有一个匹配行,不是每行只有一个模式。我用字符串替换了单词模式。这样更好:)我必须使用egrep,因为我避免循环抛出包含搜索字符串的数组。然后我就用参数expension来得到我写的。最后你