2016-07-05 86 views
0

我遇到了一個我正在寫的bash腳本的問題。我想讀取一個日誌文件並對輸出做些什麼。但問題是它每次都會記錄兩行而不是一行。所以每次我得到一份輸出而不是一行。閱讀日誌bash腳本時出錯

#!/bin/bash 
############## 

logfile=/var/atlassian/application-data/jira/log/atlassian-ing-security.log 
counter_a=0 
counter_b=0 

tail -fn0 /var/atlassian/application-data/jira/log/atlassian-jira- security.log | \ 
while read line ; do 
    echo "$line" | grep "FAILED" 
    if [ $? = 0 ] 
    then 
     echo "API action FAILED" >> $logfile 
     counter_a=$((counter_a+1)) 
     echo "Total of $counter_a API actions FAILED" >> $logfile 
    else 
     echo "API action SUCCESFULL" >> $logfile 
     counter_b=$((counter_b+1)) 
     echo "Total of $counter_b API actions SUCCESFULL" >> $logfile 
    fi 
done 

這是我使用的腳本輸出:

2016-07-05 20:11:28,335 http-bio-8080-exec-2917 anonymous 1211x943864x1 - 10.000.000.113,10.000.105.000 /rest/api/2/search HttpSession created [10n1nec] 
2016-07-05 20:11:28,381 http-bio-8080-exec-2917 AABBCC 1211x943864x1 - 10.000.000.000,10.000.105.000 /rest/api/2/search The user 'AABBCC' has PASSED authentication. 

如何刪除每次在腳本的第二行?

謝謝!

回答

0

問題是,grep的輸出也會轉到腳本的標準輸出。你可以簡單地壓制它:

if echo "$line" | grep -q FAILED; then 
    echo "API action FAILED" >> $logfile 
    counter_a=$((counter_a+1)) 
    echo "Total of $counter_a API actions FAILED" >> $logfile 
else 
    echo "API action SUCCESFULL" >> $logfile 
    counter_b=$((counter_b+1)) 
    echo "Total of $counter_b API actions SUCCESFULL" >> $logfile 
fi 

然而,更好的方法是避免在每一行(相對)昂貴的呼叫grep和使用shell本身來檢測匹配。

tail ... | { 
    while read line ; do 
    if [[ $line = *FAILED* ]]; then 
    then 
     echo "API action FAILED" 
     counter_a=$((counter_a+1)) 
    else 
     echo "API action SUCCESSFUL" 
     counter_b=$((counter_b+1)) 
    fi 
    done 
    # You probably want to execute these just once, after the entire 
    # file has been processed. 
    echo "Total of $counter_b API actions SUCCESSFUL" 
    echo "Total of $counter_a API actions FAILED" 
} >> "$logfile" 
+0

謝謝。唯一的問題是腳本必須連續運行而不是一次掃描。所以每次有人執行api時,腳本都必須將其記錄到外部文件中。 –

+0

如果您確實需要在每行之後記錄一次運行計數,則可以從我顯示的第一個片段中保留該部分,然後使用'[[...]]'命令替換'grep'管道。 – chepner

+0

令人遺憾的是,它保持記錄兩行而不是一行..我不明白它,因爲它的第一行沒有任何創建的語法.... –