请问如何加快shell处理日志文件的速度

x1060601 2018-09-03 09:30:21
我想请问大家一下,如何加快处理脚本文件的速度,脚本代码如下,感激!
insert_nat(){
echo $1 $2
v=""
sed 's/DF//g'
for((i=1; i<=$2; ++i))
do
((row=$i+$1))
values=($(awk -F '[= ]' 'NR=='$row' {print $3, $12, $14, $16, $26, $28, $30}' /var/log/natLog-$YESTERDAY))
src_ip=${values[1]}
dst_ip=${values[2]}
len=${values[3]}
proto=${values[4]}
src_port=${values[5]}
dst_port=${values[6]}
record_time=$(date -d "YESTERDAY ${values[0]}" +%s)
v="(inet_aton("\"$src_ip\""),
cast("\"$src_port\"" as signed),
inet_aton("\"$dst_ip\""),
cast("\"$dst_port\"" as signed),
"\"$proto\"",
cast("\"$len\"" as signed),
cast("\"$record_time\"" as unsigned)), "${v}
done
mysql -u$DBUSER -p$DBPASSWD tzw -e "insert into tzw_nat_log(src_ip, src_port, dst_ip, dst_port, proto, len, record_time)
values${v%,*}"
}
...全文
938 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
x1060601 2018-09-10
  • 打赏
  • 举报
回复
引用 7 楼 Runnerchin 的回复:
你的处理逻辑是每一行都读取一次文本文件吗?10W行就是读取和关闭10W次?IO开销很大啊。为什么不直接对awk -F 的结果进行循环处理?一次打开,处理10W行数据,而不是10W次打开,每次处理一行

每500行调用一次此函数,这个函数里面确实是每一行都读取一次
X-i-n 2018-09-08
  • 打赏
  • 举报
回复
你的处理逻辑是每一行都读取一次文本文件吗?10W行就是读取和关闭10W次?IO开销很大啊。为什么不直接对awk -F 的结果进行循环处理?一次打开,处理10W行数据,而不是10W次打开,每次处理一行
x1060601 2018-09-08
  • 打赏
  • 举报
回复
引用 4 楼 ljc007 的回复:
你得先搞清楚哪里慢,20w条记录每条记录都要调用一次insert_nat吗?那肯定慢啊。
应该先生成sql文件,最后用mysql命令一次执行。


您好,感谢您的回答,我试过将插入数据库的语句注释掉,速度几乎不变。应该是awk取日志字段的时候慢,这个能再优化嘛
x1060601 2018-09-08
  • 打赏
  • 举报
回复
引用 3 楼 Runnerchin 的回复:
不要直接在循环里插sql,改成把sql语句存到文本文件里,最后用mysql命令执行这个文本文件

您好,感谢您的回答,我试过将插入数据库的语句注释掉,速度几乎不变。应该是awk取日志字段的时候慢,这个能再优化嘛
ljc007 2018-09-05
  • 打赏
  • 举报
回复
你得先搞清楚哪里慢,20w条记录每条记录都要调用一次insert_nat吗?那肯定慢啊。
应该先生成sql文件,最后用mysql命令一次执行。
李庆海 2018-09-03
  • 打赏
  • 举报
回复
你好,建议用python写吧
x1060601 2018-09-03
  • 打赏
  • 举报
回复
日志记录20w条左右,还会增加
X-i-n 2018-09-03
  • 打赏
  • 举报
回复
不要直接在循环里插sql,改成把sql语句存到文本文件里,最后用mysql命令执行这个文本文件

18,772

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 专题技术讨论区
社区管理员
  • 专题技术讨论区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧