【发布时间】:2013-07-04 17:41:27
【问题描述】:
我有大量的大型日志文件(每个日志文件大约 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 不喜欢它们)。
有没有更快/更好的方法来解决这个问题?
请注意,我不需要使用正则表达式,因为我正在寻找的模式是固定的。我只想提取包含特定字符串的某些行。
【问题讨论】:
-
试过
fgrep -f pattern_file吗? Fgrep 从 pattern_file 中获取固定字符串。不要尝试 - 但值得一试。 -
所以当您仔细阅读日志文件时,您不想进行全面扫描,对吗?仅最后一次写入就足够了吗?你有时间戳的模式吗?你能限制你的搜索吗?这是一个选择吗?
-
@jm666 是的,我也尝试了 fgrep -f 但它只提高了 0.03 秒。
-
@JS웃 是的,我有一个关于时间戳的模式,但我想要对这些日志文件进行全面扫描。
标签: bash unix logging grep large-files