繁体   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