2013-08-26 59 views
0

while循环任何一个可以建议我怎么以下优化while循环是一个shell脚本的一部分。优化与awk命令

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 "[email protected]$IP.txt"` 

     else 

       TARGET=/home/database/data1/mysql_audit/sessions/user_sec 
       FILE=`echo "[email protected]$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代码(while循环的AWK虽然上面示出环路,它替换整个)替换它或者通过去除AWK优化上述代码的sed的grep需要更多时间。

+0

你用的是什么外壳? (Bash,Dash,Zsh,PDKsh,Ksh,POSIX兼容,Original-Sh兼容等) – konsolebox

+1

在优化任何内容之前,您必须测量当前性能,确定目标,确定哪些步骤负责过多的时间,并确定是否有任何优化是可能的。你如何衡量性能,以及你如何确定'awk'是问题所在? –

+0

bash shell ....我已经生成了测试用例,并计算了每个命令与测试用例所用的时间。 – vidyadhar

回答

1

1)在setvars(),删除围绕分配双引号。双引号强制shell重新扫描值。这是次要的,但在大的shell脚本,它最多可以添加相当多的处理时间。

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

3)您正在运行外部程序'ls'来检查文件是否存在。相反,请使用内置shell命令:if [! -f“$ TARGET/$ FILE”];然后 ...;网络连接。如果你想输出,只是做的:回声“$ TARGET/$ FILE”。

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

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

不可能在没有看到正在处理的数据的情况下优化awk。由于存在$(...)构造,因此您似乎拥有更现代的外壳。用$(...)替换任何反引用用法。