如何加速这个日志解析器?

时间:2016-08-30 03:19:18

标签: bash shell logging scripting text-parsing

我有一个这种格式的千兆字节日志文件:

2016-02-26 08:06:45 Blah blah blah

我有一个日志解析器,它根据日期将单个文件日志拆分为单独的文件,同时从原始行修剪日期。

我确实需要某种形式的tee,以便我可以看到这个过程有多远。

问题在于这种方法令人费解。在bash中没有办法快速做到这一点吗?或者我是否需要制作一个小程序才能完成它?

log_file=server.log
log_folder=logs

mkdir $log_folder 2> /dev/null

while read a; do
   date=${a:0:10}

   echo "${a:11}" | tee -a $log_folder/$date
done < <(cat $log_file)

2 个答案:

答案 0 :(得分:3)

bash中的{p> awk '{d=l"/"$1; $1=""; print > d}1' l=$log_directory $log_file 非常慢。你可以让它更快,但你可以用awk加快速度:

NSURLSession

如果你真的想要打印到stdout,你可以,但是如果这样做了,它将会减慢很多东西。只需使用:

NSJSONSerialization

(注意&#34; 1&#34;在结束括号后。)

答案 1 :(得分:2)

尝试这个awk解决方案 - 它应该非常快 - 它显示进度 - 只保留一个文件 - 也写入不以日期开头的行到当前日期文件,这样行不会丢失 - a默认初始日期设置为&#34; 0000-00-00&#34;如果日志以没有日期的行开头

任何时间比较都会非常感激

dir=$1
if [[ -z $dir ]]; then
  echo >&2 "Usage: $0 outdir <logfile"
  echo >&2 "outdir: directory where output files are created"
  echo >&2 "logfile: input on stdin to split into output files"
  exit 1
fi
mkdir -p $dir
echo "output directory \"$dir\""
awk -vdir=$dir '
BEGIN {
  datepat="[0-9]{4}-[0-9]{2}-[0-9]{2}"
  date="0000-00-00"
  file=dir"/"date
}
date != $1 && $1 ~ datepat {
  if(file) {
    close(file)
    print ""
  }
  print $1 ":"
  date=$1
  file=dir"/"date
}
{
  if($1 ~ datepat)
    line=substr($0,12)
  else
    line=$0
  print line
  print line >file
}
'
head -6 $dir/*

示例输入日志

first line without date
2016-02-26 08:06:45 0 Blah blah blah
2016-02-26 09:06:45 1 Blah blah blah
2016-02-27 07:06:45 2 Blah blah blah
2016-02-27 08:06:45 3 Blah blah blah
no date line
blank lines

another no date line
2016-02-28 07:06:45 4 Blah blah blah
2016-02-28 08:06:45 5 Blah blah blah

输出

first line without date

2016-02-26:
08:06:45 0 Blah blah blah
09:06:45 1 Blah blah blah

2016-02-27:
07:06:45 2 Blah blah blah
08:06:45 3 Blah blah blah
no date line
blank lines

another no date line

2016-02-28:
07:06:45 4 Blah blah blah
08:06:45 5 Blah blah blah

==> tmpd/0000-00-00 <==
first line without date

==> tmpd/2016-02-26 <==
08:06:45 0 Blah blah blah
09:06:45 1 Blah blah blah

==> tmpd/2016-02-27 <==
07:06:45 2 Blah blah blah
08:06:45 3 Blah blah blah
no date line
blank lines

another no date line

==> tmpd/2016-02-28 <==
07:06:45 4 Blah blah blah
08:06:45 5 Blah blah blah