【问题标题】:efficiently grep strings between 2 patterns in LARGE log files在 LARGE 日志文件中的 2 个模式之间有效地 grep 字符串
【发布时间】:2018-08-12 03:19:46
【问题描述】:

我正在尝试通过 grep 字符串在 2 个不同模式之间解析大型日志文件

示例:

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

我需要捕捉的线条是 pattern1/pattern2 之间的部分(所以,line4line6line8line9)。

我正在使用

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

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

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

【问题讨论】:

  • 我怀疑你会发现任何使用 awk/python 的解决方案都比 sed 更快。如果输入全是 ASCII,你可以使用 LC_ALL=C sed -n '/pattern1/,/pattern2/p' 来加快速度......另请参阅 @987654321 @如果你不希望输出中的开始/结束行
  • 你可以测试一下这是否会快一点:sed -n '/^pattern1$/,/^pattern2$/p
  • 如果真正的模式是静态字符串,使用 $0 == "pattern1" 的 awk 可能会比 sed -n '/^pattern1$/ 更快,但从总体上看,I/O 缓冲开销将大大超过和隐藏任何代码性能差异。
  • 我尝试了 Sundeep 和 Cyrus 的建议,没有观察到明显的加速。
  • @Sundeep 您提供的链接确实有帮助,谢谢!

标签: python awk sed grep


【解决方案1】:

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

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

【讨论】:

  • Louis,似乎我无法使用此命令匹配我预期的字符串,我仍在尝试弄清楚,如果我使用 re 模块找到工作模式,会告诉你,谢谢!
【解决方案2】:

你可以试试:

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

【讨论】:

  • 如果我想同时打印 pattern1 / pattern2 以及它们之间的字符串怎么办?
  • 使用 Scrutinizer 的答案?
  • 就像赛勒斯所说,这个答案包括模式 1 和模式 2。还添加了一些测试结果...
  • 是的,Cyrus 和 Scrutinizer,它确实包含 pattern1/pattern2(抱歉,我在测试中犯了一个错误,所以没有显示 pattern1/2)。至于 cmd exec 时间,我在使用“awk”命令(Ubuntu16.6)时得到了明显的改善----使用“sed -n '/pattern1/,/pattern2/p'”的时间----真正的7m14.025s user 6m56.217s sys 0m17.552s --- time using "awk '/pattern1/,/pattern2/'" ---- real 1m46.925s user 1m34.533s sys 0m13.066s
  • @Jia,如果您的系统上没有mawk,您可以尝试安装它(它应该适用于Ubuntu),看看它是否会带来进一步的改进。
猜你喜欢
  • 2015-04-10
  • 2013-11-09
  • 1970-01-01
  • 1970-01-01
  • 2022-10-14
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 2013-12-27
相关资源
最近更新 更多