【发布时间】:2018-04-25 20:31:01
【问题描述】:
我有一个脚本可以读取日志文件并解析数据以将它们插入到 mysql 表中。
我的脚本看起来像
while read x;do
var=$(echo ${x}|cut -d+ -f1)
var2=$(echo ${x}|cut -d_ -f3)
...
echo "$var,$var2,.." >> mysql.infile
done<logfile
问题是日志文件有数千行并且需要几个小时......
我读到awk 更好,我试过了,但不知道解析变量的语法...
编辑: 输入是结构防火墙日志,因此它们是非常大的文件,例如
@timestamp $HOST reason="空闲超时" source-address="x.x.x.x" 源端口="19219" 目标地址="x.x.x.x" destination-port="53" service-name="dns-udp" application="DNS"....
所以我使用了很多 grep 来处理 ~60 个变量,例如
sourceaddress=$(echo ${x}|grep -P -o '.{0,0}
source-address=\".{0,50}'|cut -d\" -f2)
如果您认为 perl 会更好,我愿意接受建议,也许会提示如何编写脚本...
【问题讨论】:
-
我认为
awk不会在时间上给您带来任何显着的改进.. -
使用其他语言。对于长时间的任务,我已经用 Perl 替换了 bash 脚本几次,区别是 巨大的。 Shell 很慢。
-
@sjsam 为什么不呢?见unix.stackexchange.com/questions/169716/…
-
@vessel 如果您添加示例输入(例如 3-5 行)并显示您需要附加到另一个文件的预期输出,这将有所帮助...无需复制您的全部要求,限制它说3个变量
-
@Sundeep :请注意,我在评论中使用了
significant。对于较大的文件,建议使用perl。此外,您指出的链接实际上并没有在工具之间进行比较。它只是讨论实践的起起落落。
标签: bash parsing awk while-loop line