Linux 使用awk命令优化while循环

Linux 使用awk命令优化while循环,linux,shell,sed,awk,grep,Linux,Shell,Sed,Awk,Grep,任何人都可以建议我如何优化下面的while循环,它是shell脚本的一部分 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=

任何人都可以建议我如何优化下面的while循环,它是shell脚本的一部分

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"
函数setvars(){
CONN_TSMP=“$1”
USER=“$2”
DB=“$3”
IP=“$4”
HOST=“$5”
返回
}
读行时;做
TST=`grep-w$line$FILE1`
ID=`echo$line | tr-d'\“'`
VARS=$(echo${TST}|awk-F''''{print$2'$10'$22'$20'$18}')
setvars$VARS
如果[-z“$IP”];然后
IP=`echo“$HOST”`
fi
如果[“$USER”==“root”]&&&[-z$DB];然后
TARGET=/home/database/data1/mysql\u audit/sessions/root\u sec
FILE=`echo“$ID-$CONN_TSMP-$USER@$IP.txt”`
其他的
TARGET=/home/database/data1/mysql\u audit/sessions/user\u sec
FILE=`echo“$ID-$CONN_TSMP-$USER@$IP.txt”`
fi
ls$TARGET/$FILE
如果[$?-ne 0];然后
3支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支支####################################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”
完成<“$FILE4”
根据我的观察,awk需要更多的时间

有谁能帮我写优化上面的代码,用setvars()中的awk代码(一个awk-while循环,它取代了上面显示的整个while循环)或者删除awk或者sed或者grep,它们需要更多的时间。

1),删除赋值周围的双引号。双引号强制shell重新扫描值。这是次要的,但在大型shell脚本中,这会增加相当多的处理时间

2) 您有多个VAR=
echo$SOMEVAL
。只需分配值:ID=$HOST FILE=“$ID-$CONN\u TSMP-$USER@$IP.txt”

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

4) 打开输出文件一次。这要快得多,但会使脚本的维护变得非常困难。因为您只有4条回显行,所以可能没有多大帮助

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

在没有看到awk正在处理的数据的情况下,不可能优化您的awk。由于有$(…)构造,您似乎有一个更现代的shell。将任何反勾号用法替换为$(…)。

您使用的shell是什么?(Bash、Dash、Zsh、PDKsh、Ksh、POSIX兼容、Original Sh兼容等)在优化任何东西之前,您必须衡量您当前的绩效,确定您的目标,确定步骤负责过多的时间,并确定是否可以进行任何优化。您如何衡量性能,以及如何确定
awk
是问题所在?bash shell…我已生成测试用例,并计算了每个命令使用测试用例所花费的时间。