在大文件上grep多个字符串

时间:2013-07-04 17:41:27

标签: bash unix logging grep large-files

我有大量的大型日志文件(每个日志文件大约200mb,我总共有200GB的数据)。

服务器每10分钟向日志文件写入大约10K个参数(带时间戳)。在每个10K参数中,我想将其中的100个提取到一个新文件中。

首先我使用带有1个参数的grep,然后LC_ALL=C使它快一点,然后我使用fgrep它也稍微快一些。然后我用了并行

parallel -j 2 --pipe --block 20M

最后,对于每200MB,我能够在5秒内提取1个参数。

但是当我在一个grep中管道多个参数时

parallel -j 2 --pipe --block 20M "egrep -n 'param1|param2|...|param100" < log.txt

然后grep操作的时间线性增加(现在grep 1文件需要相当多的几分钟)。 (注意,我必须使用egrep作为多个管道,不知何故grep不喜欢它们。)

有没有更快/更好的方法来解决这个问题?

请注意,我不需要使用正则表达式,因为我正在寻找的模式是固定的。我只想提取包含特定字符串的某些行。

2 个答案:

答案 0 :(得分:1)

在反映上述评论时,我做了另一项测试。从md5deep -rZ命令(大小:319MB)中取出我的文件。随机选择100 md5校验和(每个32chars长)。

time egrep '100|fixed|strings' md5 >/dev/null

时间

real    0m16.888s
user    0m16.714s
sys     0m0.172s

用于

time fgrep -f 100_lines_patt_file md5 >/dev/null

时间是

real    0m1.379s
user    0m1.220s
sys     0m0.158s

egrep快了近15倍。

所以,当你在egrepfgrep恕我直言的时候只得到0.3秒的改进意味着:

  • 你的IO要慢“

egrep的计算时间不会被处理器或内存减慢,而是IO和(恕我直言)因此fgrep无法提高速度。

答案 1 :(得分:0)

有趣的是,将日志文件压缩为.gz格式并使用zgrep -E可以大大缩短时间。此外,无论我是在单个zgrep命令中搜索1个模式还是多个模式,它每个200MB文件只能工作约1秒。

相关问题