任何人都可以建议我如何在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"
根据我的观察,awk花了更多的时间。
任何人都可以帮助我如何编写优化上述代码,方法是将其替换为 awk代码(替换上面显示的整个while循环的awk while循环)或者删除 awk 或 sed 或 grep 需要更多时间。
答案 0 :(得分: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”];然后 ...;网络连接。如果你想要输出,只需做一个:echo“$ TARGET / $ FILE”。
4)打开输出文件一次。这要快得多,但可以使脚本的维护变得非常困难。由于你只有4条回波线,所以可能没什么用。
exec 4>>"$TARGET/$FILE"
if [ ! -f "$TARGET/$FILE" ]; then
echo -e ... >&4
...
fi
awk -f ... >&4
exec 4>&-
如果不查看正在处理的数据,就无法优化您的awk。你似乎有一个更现代的shell,因为有一个$(...)构造。用$(...)替换任何反引号用法。