一个apache错误日志记录存储为csv文件

时间:2015-01-07 10:35:20

标签: bash perl csv

我想转换错误日志,看起来像这样:

[ Message time ]  [Message Type] [IP Address] PHP Errpr Type: Some Message with comma in it

进入类似的东西,以便我可以使用任何电子表格软件阅读:

Message Time,Message Type,IP Address,PHP Errpr Type,Some Message with comma in it

我看过Get apache logs as csv fileApache-Access-Log-to-CSV-Converter Load Testing with JMeter: Part 3 - Replaying Apache Logs。对我的案子没有帮助。

我编写了一个Bash脚本,但它需要花费大量时间才能生成600,000行的文件。

#!/bin/bash -x

rm -fv final_file
IFS=$'\n'
for i in `cat error_log | tr '[]' '"'`
do
        MSG_MESSAGE="`echo $i|awk -F']' '{print $NF}'`"
        MSG_ERROR_TYPE="`echo $MSG_MESSAGE| awk -F':' '{print $1}'`"
        MSG_DEBUG_MESSGE="`echo $MSG_MESSAGE|cut -d':' -f2-|tr ',' '.'`"
        MSG_DATE="`echo $i|awk -F']' '{print $1}'| cut -d'[' -f2`"
        MSG_TYPE="`echo $i|awk -F']' '{print $2}'| cut -d'[' -f2`"
        MSG_CLIENT="`echo $i|awk -F']' '{print $3}'| cut -d'[' -f2`"
        echo "$MSG_DATE~$MSG_TYPE~$MSG_CLIENT~$MSG_ERROR_TYPE~$MSG_DEBUG_MESSGE" >> final_file
done
unset IFS

Bash或Perl,一切正常,只要它有效。

2 个答案:

答案 0 :(得分:0)

这可以由sed轻松处理:

sed -r 's/^\[([^]]*)]\s*\[([^]]*)]\s*\[([^]]*)]\s*([^:]*):\s*/\1,\2,\3,\4,/' file
           ^^^^^^^^^^                                         ^^
               |______________________________________________|

这是一个捕获块并将其打印回来的问题

测试

$ cat a
[ Message time ]  [Message Type] [IP Address] PHP Errpr Type: Some Message with comma in it
$ sed -r 's/^\[([^]]*)]\s*\[([^]]*)]\s*\[([^]]*)]\s*([^:]*):\s*/\1,\2,\3,\4,/' a
 Message time ,Message Type,IP Address,PHP Errpr Type,Some Message with comma in it

答案 1 :(得分:0)

对fedorqui的回答略有修改

sed -r -e 's/([^]]*)$/"\1"/'  -e 's/\[//g' -e 's/\]/,/g' input

基本上相同,但是可以使用任意数量的[括号]项目并且更容易阅读 - 不确定哪些文件很大会更快。