我正在尝试解析几个 2gb 以上的文件,并希望在几个级别上进行 grep。
假设我想获取包含“foo”的行和也包含“bar”的行。
我可以做 grep foo file.log | grep bar
,但我担心运行两次会很昂贵。
改用 grep -E '(foo.*bar|bar.*foo)'
这样的东西会有好处吗?
最佳答案
grep -E '(foo|bar)'
将查找包含“foo”或“bar”的行。
您需要包含BOTH 'foo' AND 'bar' 的行。这些命令中的任何一个都可以:
sed '/foo/!d;/bar/!d' file.log
awk '/foo/ && /bar/' file.log
这两个命令——理论上——应该比你的cat |搜索引擎优化 | grep
构造因为:
sed
和awk
都执行它们自己的文件读取;无需管道开销- 我给上面的
sed
和awk
的“程序”使用 bool 短路来快速跳过不包含“foo”的行,因此只测试包含“foo”的行' 到/bar/正则表达式
但是,我还没有测试过它们。 YMMV :)
关于bash - grep 两次或一次正则表达式效率更高吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6040429/