2013-08-26 85 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。由於存在$(...)構造,因此您似乎擁有更現代的外殼。用$(...)替換任何反引用用法。