grep 两次或使用正则表达式一次是否更有效?

dtb*_*rne 6 unix bash grep

我正在尝试解析几个 2gb 以上的文件,并希望在几个级别上进行 grep 操作。

假设我想获取包含“foo”的行和也包含“bar”的行。

我可以这样做grep foo file.log | grep bar,但我担心运行两次会很昂贵。

使用类似的东西grep -E '(foo.*bar|bar.*foo)'代替会有好处吗?

pep*_*uan 6

grep -E '(foo|bar)'将找到包含“foo”“bar”的行。

您想要包含“foo”“bar”的行。这些命令中的任何一个都可以:

sed '/foo/!d;/bar/!d' file.log

awk '/foo/ && /bar/' file.log
Run Code Online (Sandbox Code Playgroud)

理论上,这两个命令应该cat | grep | grep比您的构造更有效,因为:

  • sedawk执行各自的文件读取;无需架空管道
  • 我给出的“程序”sedawk上面使用布尔短路来快速跳过不包含“foo”的行,从而仅测试包含“foo”到 /bar/ 正则表达式的行

但是,我还没有测试过它们。嗯嗯:)

  • 虽然使用单个 grep 的优点是只解析一次输入,但正则表达式并不简单。另一方面,两个管道 grep 使用更简单的表达式,匹配速度更快。正如 David W. 指出的那样,第二次调用需要处理更少的输入。不同的输入(例如不同百分比的匹配线)可能会给出相反的结果。与任何与性能相关的问题一样,在测量确切的用例之前,您永远不会真正知道什么是快的 - 直觉可能会产生误导。 (2认同)