0

任何人都可以建议我如何在作为 shell 脚本一部分的 while 循环下进行优化。

function setvars() {
    CONN_TSMP="$1"
    USER="$2"
    DB="$3"
    IP="$4"
    HOST="$5"
    return
}

while read line; do

        TST=`grep -w $line $FILE1`
        ID=`echo $line | tr -d '\"'`
        VARS=$(echo ${TST} | awk -F '"' '{print $2 " "  $10 " "  $22 " " $20 " " $18 }')
        setvars $VARS

        if [ -z "$IP" ]; then
                IP=`echo "$HOST"`
        fi

        if [ "$USER" == "root" ] && [ -z $DB ]; then

                TARGET=/home/database/data1/mysql_audit/sessions/root_sec
                FILE=`echo "$ID-$CONN_TSMP-$USER@$IP.txt"`

        else

                TARGET=/home/database/data1/mysql_audit/sessions/user_sec
                FILE=`echo "$ID-$CONN_TSMP-$USER@$IP.txt"`

        fi

        ls $TARGET/$FILE
        if [ $? -ne 0 ]; then
                echo -e "################################################################ \n" >> "$TARGET/$FILE"
                echo "$TST" | awk -F 'STATUS="0"' '{print $2}'| sed "s/[</>]//g" >> "$TARGET/$FILE"
                echo -e "\n" >> "$TARGET/$FILE"
        fi

        awk -F '"' '/"'$line'"/ {print "\n======================================\nTIMESTAMP=" $2 "\nSQLTEXT=" $10}' $FILE3 >> "$TARGET/$FILE"

done < "$FILE4"

根据我的观察,awk 需要更多时间。

任何人都可以帮助我如何编写优化上述代码,方法是用awk 代码(一个 awk while 循环替换上面显示的整个 while 循环)或删除需要更多时间的awksedgrep 。

4

1 回答 1

1

1) 在 setvars() 中,删除作业周围的双引号。双引号强制外壳重新扫描这些值。这是次要的,但在大型 shell 脚本中,它可能会增加相当多的处理时间。

2)你有多个 VAR= echo $SOMEVAL。只需分配值: ID=$HOST FILE="$ID-$CONN_TSMP-$USER@$IP.txt"

3) 您正在运行外部程序“ls”来检查文件是否存在。相反,使用内置的 shell 命令: if [ ! -f "$TARGET/$FILE" ]; 然后 ...; 菲。如果您想要输出,只需执行:echo "$TARGET/$FILE"。

4) 打开输出文件一次。这要快得多,但会使脚本的维护变得相当困难。由于您只有 4 条回声线,因此可能没有太大帮助。

exec 4>>"$TARGET/$FILE" 
if [ ! -f "$TARGET/$FILE" ]; then 
   echo -e ... >&4
   ...
fi
awk -f ... >&4
exec 4>&-

如果不查看它正在处理的数据,就不可能优化您的 awk。您似乎有一个更现代的外壳,因为有一个 $(...) 构造。用 $(...) 替换任何反引号用法。

于 2013-08-27T00:58:13.863 回答