Wat*_*att 13 unix linux search grep text
这个问题与如何有效地使用grep有关 ?
我试图在一个文件夹中搜索一个"字符串",该文件夹有8-10万个小(~2-3kb)纯文本文件.我需要知道所有具有"字符串"的文件.
起初我用过这个
grep "string"
Run Code Online (Sandbox Code Playgroud)
那太慢了.
然后我试了一下
grep * "string" {} \; -print
Run Code Online (Sandbox Code Playgroud)
根据相关问题,我使用了这个
find . | xargs -0 -n1 -P8 grep -H "string"
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
xargs: argument line too long
Run Code Online (Sandbox Code Playgroud)
有谁知道相对更快地完成这项任务的方法?
我在一台服务器机器上运行此搜索,该机器具有超过50GB的可用RAM和14个CPU内核.我希望以某种方式我可以使用所有处理能力来更快地运行此搜索.
Eve*_*ace 11
这不是那么大的文件堆栈(对10⁷文件的赞誉 - 一个混乱的梦想),但我创建了100k文件(整体400 MB)
for i in {1..100000}; do head -c 10 /dev/urandom > dummy_$i; done
Run Code Online (Sandbox Code Playgroud)
并且为纯粹的好奇心做了一些测试(我正在搜索的关键字10是随机选择的):
> time find . | xargs -n1 -P8 grep -H "10"
real 0m22.626s
user 0m0.572s
sys 0m5.800s
Run Code Online (Sandbox Code Playgroud)
> time find . | xargs -n8 -P8 grep -H "10"
real 0m3.195s
user 0m0.180s
sys 0m0.748s
Run Code Online (Sandbox Code Playgroud)
> time grep "10" *
real 0m0.879s
user 0m0.512s
sys 0m0.328s
Run Code Online (Sandbox Code Playgroud)
> time awk '/10/' *
real 0m1.123s
user 0m0.760s
sys 0m0.348s
Run Code Online (Sandbox Code Playgroud)
> time sed -n '/10/p' *
real 0m1.531s
user 0m0.896s
sys 0m0.616s
Run Code Online (Sandbox Code Playgroud)
> time perl -ne 'print if /10/' *
real 0m1.428s
user 0m1.004s
sys 0m0.408s
Run Code Online (Sandbox Code Playgroud)
顺便说一句.如果我使用管道STDOUT
来抑制输出,则运行时间没有太大差异/dev/null
.我在一台功能不太强大的笔记本电脑上使用Ubuntu 12.04;)我的CPU是Intel(R)Core(TM)i3-3110M CPU @ 2.40GHz.
更多好奇心:
> time find . | xargs -n1 -P8 grep -H "10" 1>/dev/null
real 0m22.590s
user 0m0.616s
sys 0m5.876s
> time find . | xargs -n4 -P8 grep -H "10" 1>/dev/null
real m5.604s
user 0m0.196s
sys 0m1.488s
> time find . | xargs -n8 -P8 grep -H "10" 1>/dev/null
real 0m2.939s
user 0m0.140s
sys 0m0.784s
> time find . | xargs -n16 -P8 grep -H "10" 1>/dev/null
real 0m1.574s
user 0m0.108s
sys 0m0.428s
> time find . | xargs -n32 -P8 grep -H "10" 1>/dev/null
real 0m0.907s
user 0m0.084s
sys 0m0.264s
> time find . | xargs -n1024 -P8 grep -H "10" 1>/dev/null
real 0m0.245s
user 0m0.136s
sys 0m0.404s
> time find . | xargs -n100000 -P8 grep -H "10" 1>/dev/null
real 0m0.224s
user 0m0.100s
sys 0m0.520s
Run Code Online (Sandbox Code Playgroud)