Python正则过滤syslog数组时删除不完整的问题排查与解决
问题:过滤syslog数组时部分匹配条目未被删除
场景说明
读取包含syslog内容的文本文件,示例内容如下:
Oct 3 12:09:01 webv2 CRON[1903]: (root) CMD (sudo /usr/bin/python3 /var/www/security/py_scripts/security_stuff.py 01_report_connections 0 &) Oct 3 12:09:01 webv2 CRON[1906]: (root) CMD ( [ -x /usr/lib/php/sessionclean ] && if [ ! -d /run/systemd/system ]; then /usr/lib/php/sessionclean; fi) Oct 3 12:09:03 webv2 systemd[1]: Starting Clean php session files... ... .. .
将文件内容按行拆分存入长度为6800的数组data:
data = string.splitlines()
计划通过正则表达式数组对data进行过滤,正则数组定义:
regexArray = [ ['CRON:', [ 'sec_stuff\.py report_cons' ,'\[ -x /usr/lib/php/sessionclean \] && if \[ ! -d /run/systemd/system \]; then /usr/lib/php/sessionclean; fi' ,'...' ,'..' ,'.' ] ], [...] ]
调用以下函数执行正则搜索:
def search_regexStuff(what, strings, regexString = ''): if what == 'allgemein': return re.findall(r""+regexString+"",strings)
异常现象
过滤过程中仅删除了部分匹配正则的条目:
- 针对正则
sec_stuff\.py report_cons,实际匹配2069条,但仅删除1181条; - 针对正则
\[ -x /usr/lib/php/sessionclean \] && if \[ ! -d /run/systemd/system \]; then /usr/lib/php/sessionclean; fi,实际匹配68条,但仅删除59条。
需求是通过删除匹配项缩小data数组长度,加快后续搜索效率,最终将剩余内容写入文件。原处理代码如下:
for b in regexArray: for c in b[1]: regex = '.*'+b[0][:-1]+'.*'+c+'.*' n = -1 for a in data: n += 1 findLINE = search_regexStuff('allgemein', a, regex) if len(findLINE) != 0: # 匹配到内容,数组非空 del data[n] n -= 1 o = '' for i in data: o += i+'\n' file = open('/folder/file_x.txt','w') file.write(str(o)) file.close()
解决方案(感谢@timus)
定义新函数,通过生成新数组的方式实现过滤:
def cleanMyDataArray( data, regex): o = ''; new_data = [] for a in data: findLINE = search_regexStuff('allgemein', a, regex) if len(findLINE) == 0: # 未匹配到内容 new_data.append( a ) return new_data
修改调用逻辑,用新函数迭代过滤data数组:
for b in regexArray: for c in b[1]: regex = '.*'+b[0][:-1]+'.*'+c+'.*' data = cleanMyDataArray( data, regex)
问题解决。
内容的提问来源于stack exchange,提问作者wtf_1x
相关产品推荐
相关产品推荐

