删除Python中功能不全的线型脚本

删除Python中功能不全的线型脚本,python,parsing,design-patterns,logging,Python,Parsing,Design Patterns,Logging,对于日志解析,我需要删除日志文件中的模式: 模式: 访问:讲座主持人(您的曲目列表)权限:-SID限制名称:0掩码访问:0x1“ 日志样本: # This line has to be kept 2014-03-03 09:50:20,2014-03-03 09:50:20,560,Success Audit event,Accès aux objets,Security,LA\USER1,LA-SERVER1,"Objet ouvert : Serveur de l’objet : Secur

对于日志解析,我需要删除日志文件中的模式:

模式:

访问:讲座主持人(您的曲目列表)权限:-SID限制名称:0掩码访问:0x1“

日志样本:

# This line has to be kept
2014-03-03 09:50:20,2014-03-03 09:50:20,560,Success Audit event,Accès aux objets,Security,LA\USER1,LA-SERVER1,"Objet ouvert : Serveur de l’objet : Security Type d’objet : File Objet : \vol\vol01\PROD\prod.conf Identificateur du handle : 554 Identificateur de l’opération : - ID du processus : 2050 Nom du fichier image : Server Soft Utilisateur principal : user1 Domaine principal : LA ID d’ouv. de session principale : (0x0, 0x9596) Utilisateur client : 1.2.3.4 Domaine client : - ID d’ouv. de session client : - Acces : Lecture données (ou liste de répertoire) Écriture données (ou ajout fichier) Ajout données (ou ajout sous-répertoire ou créer instance de canal) WRITE_DAC Privilèges : - Nombre de SID restreint : 0 Masque d’accès : 0x40007 "
# This line has to be removed
2014-03-03 09:52:20,2014-03-03 09:50:20,560,Success Audit event,Accès aux objets,Security,LA\USER2,LA-SERVER1,"Objet ouvert : Serveur de l’objet : Security Type d’objet : File Objet : \vol\vol01\PROD\prod.conf Identificateur du handle : 554 Identificateur de l’opération : - ID du processus : 2050 Nom du fichier image : Server Soft Utilisateur principal : user1 Domaine principal : LA ID d’ouv. de session principale : (0x0, 0x9597) Utilisateur client : 1.2.3.5 Domaine client : - ID d’ouv. de session client : - **Acces : Lecture donnees (ou liste de repertoire) Privileges : - Nombre de SID restreint : 0 Masque d acces : 0x1 "**
# This line has to be removed
2014-03-03 09:53:20,2014-03-03 09:50:20,560,Success Audit event,Accès aux objets,Security,LA\USER3,LA-SERVER1,"Objet ouvert : Serveur de l’objet : Security Type d’objet : File Objet : \vol\vol01\PROD\prod.conf Identificateur du handle : 554 Identificateur de l’opération : - ID du processus : 2050 Nom du fichier image : Server Soft Utilisateur principal : user1 Domaine principal : LA ID d’ouv. de session principale : (0x0, 0x9597) Utilisateur client : 1.2.3.6 Domaine client : - ID d’ouv. de session client : - **Acces : Lecture donnees (ou liste de repertoire) Privileges : - Nombre de SID restreint : 0 Masque d acces : 0x1 "**
我找到了一个脚本(thx到ATOzTOA)来完成这项工作(我刚刚添加了sys模块):

当我运行脚本时,它没有删除包含该模式的两行日志:只有两行中的一行

我必须再次运行一次或两次脚本以删除所有行


我不知道为什么。

在调用
pop()
时,不应递增
I
。此外,在迭代列表时,也不应使用
pop()
。这是因为如果从列表中间删除元素,则在迭代时会跳过一些项目

您应该重写
delete_line()
,如下所示:

def delete_line(dello):
    with open(fname) as f:
        data = [line for line in f if dello not in line]
    with open(fname, 'w') as f:
        f.write(''.join(data))
(请注意,还有改进的余地。)

另一个问题是给
delete\u line()
的参数错误:在
0x1
之间有一个空格。这是正确的一行:

delete_line('Acces : Lecture donnees (ou liste de repertoire) Privileges : - Nombre de SID restreint : 0 Masque d acces : 0x1 "')

顺便说一下,已经有一个优秀的程序可以从文件中过滤出行:它是(使用
-v
选项)。

我无法在本地复制您的错误。但是,我建议您可以尝试python替换方法

str.replace(旧的,新的[,最大])

它将搜索替换为字符串中所需内容的字符串

因此,您的问题的一个可能解决方案是:

import sys
fname = sys.argv[1] 

def delete_line(dello):
    cleaned_data = []
    data = open(fname).readlines()

    for line in data:
        line = line.replace(dello, "") 
        cleaned_data.append(line)

    open(fname, "w").write("".join(data))    


delete_line("Acces : Lecture donnees (ou liste de repertoire) Privileges : - Nombre de SID restreint : 0 Masque d acces : 0x1\"")
您可以用列表替换for循环

    clean_data = [line.replace(dello,"") for line in data]

@抱歉,我没有注意到其他一些问题。在原始代码中添加其他代码不起作用,但是您的第二次代码重写工作非常好。事实上,日志有很多行(我有一行有50000行),我要去试试@lexa:else
不起作用,因为您在修改列表时正在循环列表。解决此问题的一种方法是对列表中的行(数据)使用
,但这太过分了。我同意grep很好,但我必须使用跨平台工具…无论如何,感谢您的关注和帮助,我有“UnboundLocalError:分配前引用的局部变量'line'。你也这么做了吗?没问题,反正我测试了你的代码,模式没有被删除。你试过站在你这边吗?
    clean_data = [line.replace(dello,"") for line in data]