一种用于将 apache 错误日志存储为 csv 文件的衬垫
One liner for apache error logs to store as csv file
我想将错误日志转换成这样:
[ 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 file、Apache-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 }'`"
MSG_DEBUG_MESSGE="`echo $MSG_MESSAGE|cut -d':' -f2-|tr ',' '.'`"
MSG_DATE="`echo $i|awk -F']' '{print }'| cut -d'[' -f2`"
MSG_TYPE="`echo $i|awk -F']' '{print }'| cut -d'[' -f2`"
MSG_CLIENT="`echo $i|awk -F']' '{print }'| cut -d'[' -f2`"
echo "$MSG_DATE~$MSG_TYPE~$MSG_CLIENT~$MSG_ERROR_TYPE~$MSG_DEBUG_MESSGE" >> final_file
done
unset IFS
Bash 或 Perl,任何东西都可以,只要它能工作。
这可以由 sed
轻松处理:
sed -r 's/^\[([^]]*)]\s*\[([^]]*)]\s*\[([^]]*)]\s*([^:]*):\s*/,,,,/' 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*/,,,,/' a
Message time ,Message Type,IP Address,PHP Errpr Type,Some Message with comma in it
对 fedorqui 的回答稍作修改
sed -r -e 's/([^]]*)$/""/' -e 's/\[//g' -e 's/\]/,/g' input
本质上是一样的,但是可以处理任意数量的 [括号] 项目并且更容易阅读 - 如果您的文件很大,不确定哪个会更快。
我想将错误日志转换成这样:
[ 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 file、Apache-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 }'`"
MSG_DEBUG_MESSGE="`echo $MSG_MESSAGE|cut -d':' -f2-|tr ',' '.'`"
MSG_DATE="`echo $i|awk -F']' '{print }'| cut -d'[' -f2`"
MSG_TYPE="`echo $i|awk -F']' '{print }'| cut -d'[' -f2`"
MSG_CLIENT="`echo $i|awk -F']' '{print }'| cut -d'[' -f2`"
echo "$MSG_DATE~$MSG_TYPE~$MSG_CLIENT~$MSG_ERROR_TYPE~$MSG_DEBUG_MESSGE" >> final_file
done
unset IFS
Bash 或 Perl,任何东西都可以,只要它能工作。
这可以由 sed
轻松处理:
sed -r 's/^\[([^]]*)]\s*\[([^]]*)]\s*\[([^]]*)]\s*([^:]*):\s*/,,,,/' 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*/,,,,/' a
Message time ,Message Type,IP Address,PHP Errpr Type,Some Message with comma in it
对 fedorqui 的回答稍作修改
sed -r -e 's/([^]]*)$/""/' -e 's/\[//g' -e 's/\]/,/g' input
本质上是一样的,但是可以处理任意数量的 [括号] 项目并且更容易阅读 - 如果您的文件很大,不确定哪个会更快。