我正在寻找一种方法来grep多个原子,例如"foo"和"bar".我知道我可以使用
grep 'foo' file | grep 'bar'
它们来获得它们但我想知道是否有更有效的方法.任何googleing似乎只会抛出'或'基于搜索的结果,而不是'和'.
我怀疑你会得到比你选择的更有效的方式.鉴于grep可执行文件在第二个副本运行时已经被映射到内存中,并且你的正则表达式中没有回溯(不像一个egrep 'foo.*bar|bar.*foo'明显的解决方案),我认为你所拥有的是一个快速的,因为你将得到.
以下是一些示例时间来说明这一点:
allan@allan-desktop:~$ time egrep 'foo.*bar|bar.*foo' foobar | wc -l
2000
real 0m0.006s
user 0m0.004s
sys 0m0.004s
allan@allan-desktop:~$ time fgrep 'foo' foobar | fgrep 'bar' | wc -l
2000
real 0m0.039s
user 0m0.000s
sys 0m0.000s
allan@allan-desktop:~$ time egrep 'foo.*bar|bar.*foo' foobar | wc -l
2000
real 0m0.006s
user 0m0.004s
sys 0m0.008s
allan@allan-desktop:~$ time fgrep 'foo' foobar | fgrep 'bar' | wc -l
2000
real 0m0.005s
user 0m0.004s
sys 0m0.004s
Run Code Online (Sandbox Code Playgroud)
从这个不可否认的小样本来看,管道版本占用较少的系统和用户CPU时间,因此效率更高.
输入文件包含1000份:
foo-bar
bar-dgfjhdgjhdgdfgdjghdjghdfg-foo
Run Code Online (Sandbox Code Playgroud)
所以你可以运行自己的测试.
她使用100,000行输入进行同样的测试 - 你可以看到提问者方法更有效:
allan@allan-desktop:~$ time egrep 'foo.*bar|bar.*foo' foobar | wc -l
100000
real 0m0.135s
user 0m0.136s
sys 0m0.012s
allan@allan-desktop:~$ time fgrep 'foo' foobar | fgrep 'bar' | wc -l
100000
real 0m0.034s
user 0m0.048s
sys 0m0.012s
allan@allan-desktop:~$ time egrep 'foo.*bar|bar.*foo' foobar | wc -l
100000
real 0m0.151s
user 0m0.144s
sys 0m0.000s
allan@allan-desktop:~$ time fgrep 'foo' foobar | fgrep 'bar' | wc -l
100000
real 0m0.046s
user 0m0.044s
sys 0m0.012s
Run Code Online (Sandbox Code Playgroud)