我是否需要远离大文件的bash脚本?

时间:2014-11-09 11:01:04

标签: bash

我有大日志文件(1-2 GB或更多)。我是编程和bash的新手,对我来说非常有用和轻松。当我需要什么时,我可以做(有人在这里帮助我)。简单的脚本工作正常,但是当我需要复杂的操作时,也许bash这么慢也许我的编程技巧如此糟糕,工作速度太慢。

所以我需要C来进行服务器日志文件的复杂编程,还是只需要优化我的脚本?

如果我只需要优化,我如何检查我的代码在哪里不好或哪里好?


例如我有while-do循环:

  while read -r date month size;
  do  
  ...
  ...
  done < file.tmp

如何使用awk更快地运行?

1 个答案:

答案 0 :(得分:2)

这取决于你如何使用bash。为了说明,请考虑如何对可能大量的整数求和。

这个函数完成了Bash的用途:作为调用其他实用程序的控制逻辑。

sumlines_fast() {
   awk '{n += $1} END {print n}'
}

它在一百万行文件上运行0.5秒。这是可以非常有效地用于较大文件的bash代码。


同时,此函数执行Bash不适用的功能:作为通用编程语言:

sumlines_slow() {
   local i=0
   while IFS= read -r line
   do
     (( i += $line ))
   done
   echo "$i"
}

此功能很慢,需要30秒才能将相同的百万行文件相加。你不应该为更大的文件这样做。


最后,这里的功能本来可以由一个根本不了解bash的人写的:

sumlines_garbage() {
   i=0
   for f in `cat`
   do
     i=`echo $f + $i | bc`
   done
   echo $i 
}

它将叉子视为自由,因此运行速度非常慢。整理文件需要花费五个小时。你根本不应该使用它。