最有效的 grep 方法

最有效的 grep 方法

目前,我正在从包含以下任意内容的文件中提取数据:

342163477\|405760044\|149007683\|322391022\|77409125\|195978682\|358463993\|397650460\|171780277\|336063797\|397650502\|357636118\|168490006...............

该列表较长,包含约 700 个不同的值。

最有效的提取方法是什么?我可以把它分成10/20/50/100的部分...或者还有其他unix方法吗?这个 grep 通过管道传输到 python 进行进一步分析,速度足够快。

答案1

将所有这些数字放在一个文件中,每个数字占一行,然后使用grepwith-f--file=switch:

grep -f filewithcodestosearchfor filetosearchin

答案2

您尝试过使用--mmap标志吗?

来自男人:

   --mmap If possible, use the mmap(2) system call to read input, instead
          of the default read(2) system call.  In some situations, --mmap
          yields better performance.  However, --mmap can cause undefined
          behavior (including core dumps) if an input file shrinks while
          grep is operating, or if an I/O error occurs.

答案3

无需将它们放入文件中,您可以执行以下操作:

grep -F '342163477
405760044
149007683
322391022
77409125
195978682
358463993
397650460
171780277
336063797
397650502
357636118
168490006' file

同样,这也是可移植/标准的(因为在BRE中使用grep -Ff,是\|grep不是标准/便携式)。

另外,真正的问题是什么?您是否想获取包含这些数字的行或知道哪些数字出现在文件中?文件排序了吗?文件中每一行有一个数字吗?...

答案4

正如 poige 在对另一个答案的评论中提到的那样,如果可以的话,请使用grep -F/ 。fgrep这会将任何正则表达式字符视为文字。您仍然可以通过将其与该选项结合起来获得交替的效果-f file,并将您的模式放入文件中,一个模式到一行。

如果您需要模式包含正则表达式,请尝试将自己限制为经典 ERE 语法,并使用grep -E/ egrep。经典 ERE 语法不包括反向引用,因此没有以下形式的模式...(pat)...\1...:这可能会使用 DFA 来执行匹配,并且效率更高。但这取决于您的egrep 实现。关于这一点的更多讨论是这里。请注意,一些egrep 实现(例如Gnu 的实现)将接受带有反向引用的模式;但当匹配这些模式时,这里提到的效率优势肯定不会出现。

我提到egrep优化是为了理论上的兴趣,因为值得测试一下它是否有助于您的预期用途。我猜想,正如 manatwork 所说,Gnu 的 grep 引擎比你更擅长找出如何优化。

相关内容