在LARGE日志文件中有效地grep两个模式之间的字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在LARGE日志文件中有效地grep两个模式之间的字符串相关的知识,希望对你有一定的参考价值。

我试图通过两个不同模式之间的grep字符串来解析大型日志文件

例如:

line1
line2
...
lineN
pattern1
line4
line6
pattern2
....
other lines
pattern1
line8
line9
pattern2
...

我需要捕捉的线是pattern1 / pattern2之间的部分(所以,line4通过line6line8通过line9)。

我在用

sed -n '/pattern1/,/pattern2/p

搜索文件,但需要很长时间才能完成(是的,我的日志文件很大...)

我想知道是否有更有效的方法来加快搜索速度?理想情况下是单行命令(awk / grep等...)或Python。

答案

你可以试试:

awk '/pattern1/,/pattern2/'

根据我的经验,mawk可以比sed明显快于这种操作并且通常是最快的。或者gawk4可以比gawk3快得多,所以你也可以试试。

- 编辑 -

FWIW,只对一个有400万行的文件进行了一次小测试

在MacOS 10.13上:

sed  :         1.62 real         1.61 user         0.00 sys
gsed :         1.31 real         1.30 user         0.00 sys
awk  :         2.14 real         2.12 user         0.00 sys
gawk3:         5.05 real         3.90 user         1.13 sys
gawk4:         0.61 real         0.60 user         0.00 sys
mawk :         0.42 real         0.40 user         0.00 sys

在Centos 7.4上:

gsed :         1.56 real         1.54 user         0.01 sys
gawk4:         1.31 real         1.29 user         0.01 sys
mawk :         0.56 real         0.54 user         0.01 sys
另一答案

如果使用Python,可以试试这个:

m = re.search(r'(?<=pattern1)(.|\s)*?(?=pattern2)', log_file, re.MULTILINE)

以上是关于在LARGE日志文件中有效地grep两个模式之间的字符串的主要内容,如果未能解决你的问题,请参考以下文章

grep 访问多行,查找两个模式之间的所有单词

无法在日期范围之间进行 grep 模式

有效地解析具有部分的大量日志

linux如何在日志中查找关键字

使用 grep xargs sed 更有效地在文件中生成 UUID

有效地计算两个向量之间的差异