linux中的搜索优化
我有一个巨大的日志文件,大小接近3GB 我的任务是根据记录的次数生成一些报告 我需要找到分别调用StringA、StringB、StringC的时间 我现在正在做的是:linux中的搜索优化,linux,grep,bash,Linux,Grep,Bash,我有一个巨大的日志文件,大小接近3GB 我的任务是根据记录的次数生成一些报告 我需要找到分别调用StringA、StringB、StringC的时间 我现在正在做的是: grep "StringA" server.log | wc -l grep "StringB" server.log | wc -l grep "StringC" server.log | wc -l 这是一个漫长的过程,我的脚本需要将近10分钟才能完成。我想知道的是,这是否可以优化?是否可以运行一个grep命令并找出分别调
grep "StringA" server.log | wc -l
grep "StringB" server.log | wc -l
grep "StringC" server.log | wc -l
这是一个漫长的过程,我的脚本需要将近10分钟才能完成。我想知道的是,这是否可以优化?是否可以运行一个grep命令并找出分别调用StringA、StringB和StringC的时间 当然,这种方法可以优化,因为grep不执行任何文本索引。我会使用一个文本索引引擎,比如来自或这个的。此外,您可以考虑使用StordD的Stordald,它以结构化和索引格式存储日志,因此查找更加有效。 < P>当然,这种方法可以优化,因为GRIP不执行任何文本索引。我会使用一个文本索引引擎,比如来自或这个的。此外,您可以考虑使用StordD的SyrdAd,它以结构化和索引格式存储日志,因此查找更加有效。 < P> >许多代码> GRPPS<代码>,所以很少的时间……-)p> 根据研究,在大文件搜索中,直接的
grep
搜索速度大约是awk
搜索速度的7倍
如果是这种情况,当前方法可以通过将grep
更改为fgrep
来优化,但前提是搜索的模式不是正则表达式fgrep
针对固定模式进行了优化
如果与原始日志文件条目相比,实例的数量相对较少,那么使用grep
版本的egrep
创建一个包含所有三个实例的临时文件可能是一种改进:
egrep "StringA|StringB|StringC" server.log > tmp.log
grep "StringA" tmp.log | wc -c
grep "StringB" tmp.log | wc -c
grep "StringC" tmp.log | wc -c
grep
的egrep
变体允许在两个或多个单独的搜索字符串之间使用|
(垂直条/管道)字符,以便您可以在语句中找到多个字符串。您可以使用grep-E
做同样的事情
完整的文档在
mangrep
页面中,有关egrp从man7re_format
命令中使用的扩展正则表达式的信息。如此多的grep
如此少的时间…:-)
根据研究,在大文件搜索中,直接的grep
搜索速度大约是awk
搜索速度的7倍
如果是这种情况,当前方法可以通过将grep
更改为fgrep
来优化,但前提是搜索的模式不是正则表达式fgrep
针对固定模式进行了优化
如果与原始日志文件条目相比,实例的数量相对较少,那么使用grep
版本的egrep
创建一个包含所有三个实例的临时文件可能是一种改进:
egrep "StringA|StringB|StringC" server.log > tmp.log
grep "StringA" tmp.log | wc -c
grep "StringB" tmp.log | wc -c
grep "StringC" tmp.log | wc -c
grep
的egrep
变体允许在两个或多个单独的搜索字符串之间使用|
(垂直条/管道)字符,以便您可以在语句中找到多个字符串。您可以使用grep-E
做同样的事情
完整文档位于
man grep
页面,有关EGRP从man 7 re_format
命令使用的扩展正则表达式的信息。您可以使用grep-c
而不是wc-l
:
grep -c "StringA" server.log
grep
无法报告单个字符串的计数。您可以使用awk:
out=$(awk '/StringA/{a++;} /StringB/{b++;} /StringC/{c++;} END{print a, b, c}' server.log)
然后,您可以使用一个简单的数组提取每个计数:
这(
grep
没有wc
)肯定会更快,而且可能awk
解决方案也会更快。但是我没有测量任何值。您可以使用grep-c
而不是wc-l
:
grep -c "StringA" server.log
grep
无法报告单个字符串的计数。您可以使用awk:
out=$(awk '/StringA/{a++;} /StringB/{b++;} /StringC/{c++;} END{print a, b, c}' server.log)
然后,您可以使用一个简单的数组提取每个计数:
这(
grep
没有wc
)肯定会更快,而且可能awk
解决方案也会更快。但是我没有测量任何值。您可以使用grep-c
而不是wc-l
:grep-c“StringA”server.log
grep
无法报告单个字符串的计数。你可以使用awk
:awk'/StringA/{a++;}/StringB/{b++;}/StringC/{c++;}END{print a,b,c}server.log
@l3x我正要写一个答案,里面正好包含你在这条评论中写的东西,然后我看到了这条评论。。。想把它变成一个答案吗?@BenjaminW。我不愿意发布它,因为OP正在寻找一个“快速”的解决方案。我不确定这对他来说是否足够快。无论如何,现在已经发布。您可以使用grep-c
而不是wc-l
:grep-c“StringA”server.log
grep
无法报告单个字符串的计数。你可以使用awk
:awk'/StringA/{a++;}/StringB/{b++;}/StringC/{c++;}END{print a,b,c}server.log
@l3x我正要写一个答案,里面正好包含你在这条评论中写的东西,然后我看到了这条评论。。。想把它变成一个答案吗?@BenjaminW。我不愿意发布它,因为OP正在寻找一个“快速”的解决方案。我不确定这对他来说是否足够快。不管怎么说,现在已经发布了。我希望awk会快得多,因为它只浏览了文件一次,三个grep必须浏览三次。我希望awk会快得多,因为它只浏览了文件一次,三个grep必须浏览三次。这些不会单独显示计数,OP要求,不过,谢谢你的观察,我确实忽略了分开计算的必要性。我已经修改了我的答案来弥补这个问题。David Lyness测试中的awk
不仅仅是计算正则表达式匹配项<代码>grep可能有点快