[英]Shell Script loop is executing multiple times
我有一個日志文件。 每當有新日志出現時,我都會執行tail -f和grep選項。 我面臨循環問題,它正在執行多次。 這是我的劇本,
AuditTypeID=$""
QueryResult=$""
tail -n 0 -F hive-server2.log \
| while read LINE
do
if [ `echo $LINE | grep -c "select *" ` -gt 0 ]
then
AuditTypeID=15
QueryResult=$(
awk '
BEGIN{ print "" }
/Executing command\(queryId/{ sub(/.*queryId=[^[:space:]]+: /,""); q=$0 }
/s3:\/\//{ print "," q }
' OFS=',' hive-server2.log \
| sed -n \$p
)
elif [ `echo $LINE | grep -c 'select count' ` -gt 0 ]
then
AuditTypeID=22
QueryResult="$(
grep -oE 'select count\(.\) from [a-zA-Z][a-zA-Z0-9]*' hive-server2.log \
| sed -n \$p
)"
fi
user=$(
cat hive-server2.log \
| grep user \
| awk -F "[. ]" '{print "," $(NF-1)}' \
| tr -d ',' \
| tr -d 'UTC'
)
Additional_Info=$(
echo -e "{\"user\":\"""${user}""\", \"query\":\"""${QueryResult}""\",\"s3Path\":\"""${s3}""\"}"
)
echo -e "$Additional_Info" > op.json
for file in /var/log/hive/op.json
do
boto-rsync $file s3://hive-log/log/script/$file.$current_time
done
done
它將根據關鍵字過濾操作。 由於某種原因,它執行了多次。 我只需要保存一個實例的輸出,就可以幫助您簡化邏輯。
我在腳本中看到的第一件事是,在if
語句內的第一個awk腳本中,您似乎正在重新解析整個hive-server2.log
(這可能很不好/很壞,因為您要跟蹤腳本和hive-server.log
正在增長?)...,日志的重新解析似乎是腳本中的常見主題-我認為這是問題的根本原因。
一個簡單的簡化;)顯而易見的是刪除了elif
代碼-它永遠不會運行,因為/select count/
將與if
語句的/select */
匹配。
為了真正簡化這個過程,我的策略是用awk重寫整個過程。 您在這里所做的任何事情都無法超越awk的內置功能-而且awk可以像sh一樣輕松地觸發外部shell命令。 awk的實現也可能會快得多。
我開始嘗試進行此轉換,但是用您指定hive-server2.log
多次重新解析的方式,坦率地說,我迷路了。 有一點輸入和預期的輸出將在這里有所幫助...請發布hive-server2.log
和您的預期輸出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.