2013-02-19 102 views
0

我有一个包含多个日志文件的“/ pcap_test”目录。每个文件都有一个模式,如:Python中的匹配模式

Pkt: 1 (358 bytes), LIFE: 1, App: itunes (INTO), State: TERMINATED, Stack: /ETH/IP/UDP/itunes, Error: None

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

Pkt: 3 (149 bytes), LIFE: 2, App: pizzeria (INTO), State: TERMINATED, Stack: /ETH/IP/UDP/pizzeria, Error: None

在这种情况下,我想输出为第二线,因为在“应用”的内容是不存在的“堆栈”

我写了一个小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”,我想使用,而不是单独的日志文件,以获得输出。

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

回答

0

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

由于grep是一个命令行正则表达式工具,并且由于您已经有了一个正常工作表达式,所以您只需学会使用Python的re module即可。

捕获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. 

根据你的数据,你可能要use re.search() instead of re.match()

+0

表达式: firstReMatch = re.match('App:([^,] *)\(INTO \)。* Stack:。* \ 1。* $',line) 将无法​​在python中工作它工作在grep。有一些空间需要在python(/ s)中使用正则表达式来处理。正如你所指出的那样,我试图用puthon得到相同的输出结果; s re.findall()但是由于困惑而无法得到任何解决方案。使用grep可能需要子进程调用,但我认为使用regix可以解决此问题。只是无法击中它的头。 – 2013-02-19 08:56:51

+0

@学习我不明白。你不能将我的答案中的代码转换成你想要的东西?顺便说一下,我意识到我没有使用原始字符串('r“,这是一个原始字符串,前面有'r')。我已经更新了我的答案。 – acattle 2013-02-19 11:35:00

+0

我得到了使用re.findall工作。感谢帮助。 – 2013-02-21 18:31:05