2015-06-29 23 views
0

我們其中我們店所有的錯誤日誌在某日的文件中datewise目錄一個錯誤日誌的目錄結構 -搜索字符串發生,顯示目錄明智計數

errorbackup/20150629/errorlogFile3453123.log.xml 
errorbackup/20150629/errorlogFile5676934.log.xml 
errorbackup/20150629/errorlogFile9812387.log.xml 
errorbackup/20150628/errorlogFile1097172.log.xml 
errorbackup/20150628/errorlogFile1908071_log.xml 
errorbackup/20150627/errorlogFile5675733.log.xml 
errorbackup/20150627/errorlogFile9452344.log.xml 
errorbackup/20150626/errorlogFile6363446.log.xml 

我要搜索的特定字符串錯誤日誌文件並獲取輸出,以便我將獲得該字符串出現次數的目錄明智搜索結果。例如grep的「blahblahSQLError」應該輸出什麼喜歡 -

20150629:0 
20150628:0 
20150627:1 
20150626:1 

這是必要的,因爲我們在釋放一個固定的一些錯誤,我想確保有那一天起就沒有這個錯誤的出現部署到Prod。另請注意,每天都會創建數千個錯誤日誌文件。每個錯誤日誌文件都使用名稱中的隨機數創建,以確保唯一性。

回答

0

如果您確定日誌文件的文件名不會包含任何「奇怪」的字符或換行符,那麼類似下面的內容應該可以工作。

for dir in errorbackup/*; do 
    printf '%s:%s\n' "${dir#*/}" "$(grep -l blahblahSQLError "$dir/"*.xml | wc -l)" 
done 

如果他們能有意想不到的名字,那麼你就需要使用多次調用grep和人工計數匹配的文件,我相信。像這樣的東西。

for dir in errorbackup/*; do 
    _dcount=0; 
    for log in "$dir"/*.xml; do 
     grep -l blahblahSQLError "$log" && _dcount=$((_dcount + 1)); 
    done 
done 
+0

感謝您回覆伊坦。第一個不適合我。我猜想開始和結束雙引號的數量不匹配。第二個錯誤「附近出現意外令牌的語法錯誤'」do'「。我將這些命令作爲單線命令輸入,因爲我無法將其作爲腳本運行。 – datastax

+0

第一個有打字錯誤。我正在修復它。如果你需要第二個單線程,你需要在'_dcount = 0;'和'in'))中使用分號。 done'。我也會添加這些。 –

0

像這樣的東西應該這樣做:

for dir in errorbackup/* 
do 
    awk -v dir="${dir##*/}" -v OFS=':' '/blahblahSQLError/{c++} END{print dir, c+0}' "$dir"/* 
done 

有可能與findxargs做到這一點,以避免迴路中的可愛方式,你當然可以做到這一切一個awk命令,但生命的內太短....