当前位置:  开发笔记 > 编程语言 > 正文

高效的grep方法匹配两个原子?

如何解决《高效的grep方法匹配两个原子?》经验,为你挑选了1个好方法。

我正在寻找一种方法来grep多个原子,例如"foo"和"bar".我知道我可以使用
grep 'foo' file | grep 'bar'
它们来获得它们但我想知道是否有更有效的方法.任何googleing似乎只会抛出'或'基于搜索的结果,而不是'和'.



1> paxdiablo..:

我怀疑你会得到比你选择的更有效的方式.鉴于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

从这个不可否认的小样本来看,管道版本占用较少的系统和用户CPU时间,因此效率更高.

输入文件包含1000份:

foo-bar
bar-dgfjhdgjhdgdfgdjghdjghdfg-foo

所以你可以运行自己的测试.

她使用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

推荐阅读
保佑欣疼你的芯疼
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有