0

我有一个目录“/pcap_test”,其中包含几个日志文件。每个文件都有一个模式,如:

Pkt:1(358 字节),LIFE:1,应用程序:itunes (INTO),状态:TERMINATED,堆栈:/ETH/IP/UDP/itunes,错误:无

Pkt: 2 (69 bytes), LIFE: 2, App: zynga (INTO), State: INSPECTING, Stack: /ETH/IP/UDP, Error: None

Pkt:3(149 字节),LIFE:2,应用程序:pizzeria (INTO),状态:TERMINATED,堆栈:/ETH/IP/UDP/pizzeria,错误:无

在这种情况下,我希望输出是第二行,因为“应用程序”中的内容不存在于“堆栈:”中

我编写了一个小的 Python 脚本来遍历目录,打开每个文件并打印输出:

import os
list = os.listdir("/home/test/Downloads/pcap_test")
print list
for infile in list:
  infile = os.path.join("/home/test/Downloads/pcap_test" , infile)

if os.path.isfile(infile):
str = file(infile, 'r').read()
print str

我以某种方式使用 grep 获得了输出,但无法在 python 脚本中使用相同的输出。它类似于:

grep -vP 'App: ([^, ]*) \(INTO\).*Stack: .*\1.*$' xyz.pcap.log | grep -P 'App: ([^, ]*) \(INTO\)'

由于我已经有了名为 "str" 的文件,我想使用它而不是单个日志文件来获取输出。

在这方面的任何帮助将不胜感激。

4

1 回答 1

0

首先,我建议不要str使用 Python 对String原始数据类型的名称这样的变量名称。

由于 grep 是一个命令行正则表达式工具,而且你已经有了一个可以工作的正则表达式,所以你需要做的就是学习使用 Python 的re模块

有点困难的是捕捉 grep 的-v行为。我建议逐行读取文件并仅在它与您的第一个正则表达式不匹配但与第二个正则表达式匹配时打印该行,如下所示:

if os.path.isfile(infile):
    with file(infile, 'r') as logFile: #this will close the file pointer automatically when you finish
        for line in logFile: #read logFile one line at a time
            firstReMatch = re.match(r'App: ([^, ]*) \(INTO\).*Stack: .*\1.*$', line) #check if this line matches your first regex
            secondReMatch = re.match(r'App: ([^, ]*) \(INTO\)', line) #check if this line matched your second regex
            if secondReMatch and not firstReMatch: #"not" to capture the inverse match
                print line #print the line.

根据您的数据,您可能希望使用re.search()而不是re.match()

于 2013-02-19T07:23:43.157 回答