优化linux中的搜索

时间:2016-01-31 01:56:39

标签: linux 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被单独调用的时间?

3 个答案:

答案 0 :(得分:2)

您可以使用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)

然后,您可以使用简单的数组提取每个计数:

arr=($out)
echo "StringA="${arr[0]}
echo "StringA="${arr[1]}
echo "StringA="${arr[2]}

这(grep没有wc)肯定会更快,awk解决方案也可能更快。但我没有测量任何。

答案 1 :(得分:0)

当然,这种方法可以优化,因为grep不会执行任何文本索引。我会使用文本索引引擎,例如来自this reviewstackexchange QA的引擎。您也可以考虑使用来自systemd的journald,它以结构化和索引格式存储日志,因此查找更有效。

答案 2 :(得分:0)

这么多greps这么短的时间......: - )

根据David Lyness,直接grep搜索的速度大约是大文件搜索中awk的7倍。

如果是这种情况,可以通过将grep更改为fgrep来优化当前方法,但前提是正在搜索的模式是不是正则表达式。 fgrep针对固定模式进行了优化。

如果实例数与原始日志文件条目相比相对较小,则使用egrepgrep创建一个填充了所有三个实例的临时文件可能是一种改进:

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

egrep的{​​{1}}变体允许在两个或多个单独的搜索字符串之间使用grep(竖线/竖线)字符,以便您可以在语句中找到多个字符串。您可以使用|执行相同的操作。

完整文档位于grep -E页面,以及有关egrep使用man grep命令的扩展正则表达式的信息。