bash脚本的性能问题

时间:2017-10-21 10:52:23

标签: bash optimization big-o

我编写了一个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个字符的直接比较,看起来不应该计算成本如此昂贵?

感谢。

2 个答案:

答案 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] *”。