2011-07-12 40 views
0

早/晚全部插入,在bash腳本解析ClamAV的日誌使用正則表達式在MySQL

我有哪裏我正在爲使用ClamAV的掃描惡意軟件的工作,然後將腳本中的問題這是MySQL的結果,通過使用grep和awk生成的ClamAV日誌將日誌的右側部分轉換爲變量。我遇到的問題是,雖然我已經完成了總結,但檢測的語法使其稍微困難一些。我在任何方面都不是正則表達式方面的專家,這是一種學習體驗,因此可能比我有更好的方法!

的線,我試圖解析看起來好像是這些:

/net/nas/vol0/home/recep/SG4rt.exe: Worm.SomeFool.P FOUND 
/net/nas/vol0/home/recep/SG4rt.exe: moved to '/srv/clamav/quarantine/SG4rt.exe' 

至於我能夠確定,我需要一個積極的回顧後,以匹配之後和冒號之前發生了什麼,而無需實際匹配冒號或後面的空格,而我無法從RegExr中看到明確的方式,而沒有考慮到我試圖尋找兩個冒號。更糟糕的是,我們有時把這些太...

WARNING: Can't open file /net/nas/vol0/home/laser/samples/sample1.avi: Permission denied 

最終的結果是,我可以建立一個MySQL查詢插入路徑,惡意軟件發現,它被轉移到或者出現錯誤然後是路徑,然後遇到錯誤,以便將每個元素轉換爲while語句中的變量內容。

我已經做了掃描內容摘要如下:

總結是這樣的:

----------- SCAN SUMMARY ----------- 
Known viruses: 329 
Engine version: 0.97.1 
Scanned directories: 17350 
Scanned files: 50342 
Infected files: 3 
Total errors: 1 
Data scanned: 15551.73 MB 
Data read: 16382.67 MB (ratio 0.95:1) 
Time: 3765.236 sec (62 m 45 s) 

解析如下:

SCANNED_DIRS=$(cat /srv/clamav/$IY-scan-$LOGTIME.log | grep "Scanned directories" | awk '{gsub("Scanned directories: ", "");print}') 
SCANNED_FILES=$(cat /srv/clamav/$IY-scan-$LOGTIME.log | grep "Scanned files" | awk '{gsub("Scanned files: ", "");print}') 
INFECTED=$(cat /srv/clamav/$IY-scan-$LOGTIME.log | grep "Infected files" | awk '{gsub("Infected files: ", "");print}') 
DATA_SCANNED=$(cat /srv/clamav/$IY-scan-$LOGTIME.log | grep "Data scanned" | awk '{gsub("Data scanned: ", "");print}') 
DATA_READ=$(cat /srv/clamav/$IY-scan-$LOGTIME.log | grep "Data read" | awk '{gsub("Data read: ", "");print}') 
TIME_TAKEN=$(cat /srv/clamav/$IY-scan-$LOGTIME.log | grep "Time" | awk '{gsub("Time: ", "");print}') 
END_TIME=$(date +%s) 
mysql -u scanner_parser --password=removed sc_live -e "INSERT INTO bs.live.bs_jobstat VALUES (NULL, '$CURRTIME', '$PID', '$IY', '$SCANNED_DIRS', '$SCANNED_FILES', '$INFECTED', '$DATA_SCANNED', '$DATA_READ', '$TIME_TAKEN', '$END_TIME');" 
rm -f /srv/clamav/$IY-scan-$LOGTIME.log 

其中有些變量是從其它部分腳本,可以忽略。我這樣做的原因是爲了節省日誌文件的混亂,並有一個簡單的基於Web的系統狀態概述。

任何線索?我是否以錯誤的方式去解決這一切?感謝您的幫助,我非常感謝!

回答

1

從我可以從問題中確定的問題看來,您似乎在問如何從以WARNING,ERROR,INFO開頭的記錄器行中區分所需的行。

你可以做到這一點,而不會喜歡向前看或向後看。只需用grep的行

"/net/nas/vol0/home/recep/SG4rt.exe: " 

然後開始使用AWK您可以提取該行的其餘部分。或者,您可以在摘要處理部分中輸入您的前綴。

就處理摘要的問題而言,最讓我印象深刻的是,您正在多次處理整個文件,每次都拉出一種線。對於這樣的任務,我會使用Perl,Ruby或Python,並通過文件傳遞,收集冒號後面的每行代碼段,將它們存儲在常規編程語言變量(而不是env變量)中,並形成MySQL插入字符串使用插值。

Bash對於某些事情很好,但恕我直言,你有理由使用更通用的腳本語言(Perl,Python,Ruby)。

+0

我希望他們都以WARNING,ERROR或INFO開頭,但是對於ClamAV他們有點混合。檢測開始於在行尾檢測到惡意軟件的惡意軟件的路徑。儘管如此,我可以通過在該行末尾出現單詞「FOUND」來匹配它,但是無論從它出來的任何正則表達式都必須確保它在最後,以防萬一有文件帶有錯誤在其中出現「FOUND」字樣,Web界面表示這是一個檢測而不是錯誤。我想我已經走過了很長的一段路,而且還有另一種選擇。從來沒有做過Perl! –

+0

你能提取正確的線條嗎?找到以FOUND結尾的單詞並不難。至於你是否正在採取正確或錯誤的方式,下面是一件事情:日誌處理應該是關於每次查看日誌的每一行,並且對該行進行處理或將其扔掉。在你的情況下,對於每一行,你都會碰到零個或更多的某種計數器。爲此,人們通常使用Perl,Python或Ruby。 –

+0

我會聽取您的建議,並以此爲契機來選擇Perl。只要我能夠與MySQL交談,我應該沒問題,但我很肯定這是可能的。 ;) –