【发布时间】:2017-08-10 22:44:25
【问题描述】:
我有一个 bash 脚本,可以从两个时间戳之间的文件中提取日志。但是,随着文件变得越来越大(超过 2 GB,最高可达 10GB),完成所需的时间相当长(超过 20 分钟)
我的日志结构如下所示:
087B0037 08AD0056 03/09 02:40:40 [MMS:Main,INF] MMS state changed
087B0037 096100BE 03/09 02:40:41 [Navigation,INF] CDDClient Initialize...
EndeavourDriver: 03/09/2017 02:40:42 :
00400004 047B0012 EndeavourDriver: 71 [SDIO87871]:
087B0037 0BE10002 03/10 06:40:40 [NNS:NNS,INF] Initializing NNS thread id 0x0BE10002...
087B0037 08AD0056 03/10 06:40:40 Initialized state: BITServer
我的脚本使用以下命令:
grep -a -A 1000000 "03/09" fileName.txt | grep -a -B 1000000 "03/10"
但是时间太长了。如果我添加时间(例如“03/09 02:”)会更快,但日志并不总是在运行,因此可能会丢失一些时间值。 日期值总是在第 3 列,所以我尝试使用 awk:
awk '$3 >= "03/09" && $3 <= "03/10"' fileName.txt
但这并没有收集以下行:
EndeavourDriver: 03/09/2017 02:40:42 :
00400004 047B0012 EndeavourDriver: 71 [SDIO87871]:
我对 awk、sed 和 grep 不太熟悉,因此如有任何建议,我们将不胜感激。也许像python这样的不同语言的东西会更好? 谢谢
【问题讨论】:
-
EndeavourDriver: 03/09/2017 02:40:42 : 00400004 047B0012 EndeavourDriver: 71 [SDIO87871]:行之间有一个换行符,但您希望它们被视为单行。为什么? -
最有效的方法是从一个不错的时间戳格式开始,无需解析其元素即可进行比较。
-
@Eric,是否应该将多于两行视为单行?
-
@RomanPerekhrest 这就是日志的保存方式。我无法控制那个。如果它在一行中,我认为它不会对我的 awk 命令产生影响?
-
@Erik,如果它是一个单一的,它会更容易解析。在其他情况下,格式不明确且出乎意料
标签: awk grep text-processing