我编写了一个bash脚本,负责“折叠”日志文件。给定格式的日志文件:
mmap
将日志文件折叠为带有分隔符的单个带衬里文件:
21 Oct 2017 12:38:03 [DEBUG] Single line message
21 Oct 2017 12:38:05 [DEBUG] Multi line
message
that may continue
several lines
21 Oct 2017 12:38:07 [DEBUG] Single line message
以下bash脚本实现了这个目标,但速度极慢。在8核32 gb机器上,500mb输入日志可能需要30分钟。
21 Oct 2017 12:38:03 [DEBUG] Single line message
21 Oct 2017 12:38:05 [DEBUG] Multi line; message; that may continue; several lines
21 Oct 2017 12:38:07 [DEBUG] Single line message
我是如何优化此脚本的?它似乎并不像正则表达式是瓶颈(我的第一次优化),因为现在条件很少被击中。
日志文件中的大多数行都是单行,所以它只是前11个字符的直接比较,看起来不应该计算成本如此昂贵?
感谢。
答案 0 :(得分:2)
使用 awk
它会更快,因为它不会产生多个进程。
$ awk '/^[^0-9]/{ORS="; "} /^[0-9]/{$0=(FNR==1)?$0:RS $0; ORS=""} END{printf RS}1' file
21 Oct 2017 12:38:03 [DEBUG] Single line message
21 Oct 2017 12:38:05 [DEBUG] Multi line message; that may continue ; several lines;
21 Oct 2017 12:38:07 [DEBUG] Single line message
/^[^0-9]/{ORS="; "}
:如果行以非数字开头,则将输出记录分隔符设置为;
,而不是默认\n
/^[0-9]/{$0=(FNR==1)?$0:RS $0; ORS=""}
:如果以数字开头,则设置ORS=""
并将RS
或\n
添加到记录中(第一行除外FNR==1
我们在开始时不想要换行的地方
答案 1 :(得分:1)
您可以使用sed
> boxplot(Treatment2 ~ WBSF2, data=df)
Error in as.data.frame.default(data, optional = TRUE) :
cannot coerce class ""function"" to a data.frame
您可以根据需要调整正则表达式“[0-9] [0-9] *”。