linux中的搜索优化

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命令并找出分别调

我有一个巨大的日志文件,大小接近3GB

我的任务是根据记录的次数生成一些报告

我需要找到分别调用StringA、StringB、StringC的时间

我现在正在做的是:

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可能有点快