我想请问大家一下,如何加快处理脚本文件的速度,脚本代码如下,感激!
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%,*}"
}

解决方案 »

  1.   

    你好,建议用python写吧
      

  2.   

    不要直接在循环里插sql,改成把sql语句存到文本文件里,最后用mysql命令执行这个文本文件
      

  3.   

    你得先搞清楚哪里慢,20w条记录每条记录都要调用一次insert_nat吗?那肯定慢啊。
    应该先生成sql文件,最后用mysql命令一次执行。
      

  4.   

    您好,感谢您的回答,我试过将插入数据库的语句注释掉,速度几乎不变。应该是awk取日志字段的时候慢,这个能再优化嘛
      

  5.   


    您好,感谢您的回答,我试过将插入数据库的语句注释掉,速度几乎不变。应该是awk取日志字段的时候慢,这个能再优化嘛
      

  6.   

    你的处理逻辑是每一行都读取一次文本文件吗?10W行就是读取和关闭10W次?IO开销很大啊。为什么不直接对awk -F 的结果进行循环处理?一次打开,处理10W行数据,而不是10W次打开,每次处理一行