簡體   English   中英

使用正則表達式解析 Bash 腳本中的 ClamAV 日志以插入 MySQL

[英]Parse ClamAV logs in Bash script using Regex to insert in MySQL

早/晚,

我遇到了一個問題,我正在為使用 ClamAV 掃描惡意軟件的工作編寫腳本,然后通過使用 grep 和 Z5E4C8DFA9E20567E23B255E 將生成的 ClamAV 日志獲取到 MySQL 中多變的。 我遇到的問題是,雖然我已經完成了總結,但檢測的語法使它變得稍微困難一些。 我絕對不是正則表達式的專家,這是一種學習經驗,所以可能有比我更好的方法!

我試圖解析的行如下所示:

/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 查詢,該查詢插入路徑、找到的惡意軟件以及移動到的位置,或者如果有錯誤然后是路徑,然后遇到錯誤,以便將每個元素轉換為 a 中的變量內容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 的系統狀態概述。

有什么線索嗎? 我是不是走錯了路? 提前感謝您的幫助,我非常感謝!

從我可以從問題中確定的內容來看,您似乎在問如何區分您想要的行與以 WARNING、ERROR、INFO 開頭的記錄器行。

您可以做到這一點,而無需花心思使用前瞻或后瞻。 以 grep開頭的行

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

然后使用 awk 您可以提取該行的其余部分。 或者您可以像在摘要處理部分中所做的那樣gsub前綴。

至於處理摘要的問題,最讓我印象深刻的是您正在多次處理整個文件,每次都提取一種行。 For tasks like this, I would use Perl, Ruby, or Python and make one pass through the file, collecting the pieces of each line after the colon, storing them in regular programming language variables (not env variables), and forming the MySQL insert使用插值的字符串。

Bash 非常適合某些事情,但恕我直言,您有理由使用更通用的腳本語言(想到 Perl、Python、Ruby)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM