2016-12-03 69 views
1

我從txt格式防火牆日誌文件的輸出,例如:加入多個正則表達式

src=10.10.10.1 srcPort=15003 dst=20.20.20.1 service=443 host=FirewalName proto=tcp 
src=30.30.30.1 srcPort=18003 dst=40.40.40.1 service=8080 host=FirewalName proto=tcp 

我的正則表達式內置提取我需要的信息(SRC,DST,服務),但我需要能夠加入正則表達式的輸出,並將輸出寫入文件,並在每個服務=對象之前使用「TCP」選項卡,對於日誌文件中的每一行,輸出到新文件看起來像:

10.10.10.1 20.20.20.1 TCP 443 
30.30.30.1 40.40.40.1 TCP 8080 

此外,我需要能夠區分之間烯在服務「TCP」和「UDP」 =輸入文件,的一部分。這樣,所寫入輸出文件是例如正確:如果輸入文件的第三行是:

src=50.50.50.1 srcPort=21003 dst=60.60.60.1 service=161 host=FirewalName proto=udp 

我我被困在這裏,需要幫助。

import re 
import sys 

with open("SFD-IPs.txt", "r") as file: 
    text = file.read() 

sources = re.findall(r'src=(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})', text) 
dest = re.findall(r'dst=(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})\.(?:[\d]{1,3})', text) 
service = re.findall(r'service=(\d+)', text) 


with open("output.txt", "w") as TufinReq: 
    TufinReq.write(sIP) 

f=open("output.txt", "r") 
del_list = ["src=", "dst=", "service="] 
list = [] 
for line in f: 
    for word in del_list: 
     if word in line: 
      line = line.replace(word, "") 
    list.append(line) 
f.close() 
f=open("output.txt", "w+") 
for line in list: 
    f.write(line) 
f.close() 

回答

1

首先,你需要分割的sourcesdest每個項目來檢索像下面的所需數據:

sources = [item.split('=')[1] for item in sources] 
dest = [item.split('=')[1] for item in dest] 

現在你可以使用zip()內置的功能如下:

with open('output.txt', 'w') as f: 
    for item in zip(sources, dest, service): 
     f.write('{}\t{}\tTCP\t{}\n'.format(*item)) 

如果您還想添加協議,您可以執行以下操作:

proto = re.findall(r'proto=(\w+)', text) 
proto = [item.upper() for item in proto] 

with open('output.txt', 'w') as f: 
    for item in zip(sources, dest, proto, service): 
     f.write('{}\t{}\t{}\t{}\n'.format(*item)) 

輸出:

output.txt文件的內容:

text = '''src=10.10.10.1 srcPort=15003 dst=20.20.20.1 service=443 host=FirewalName proto=tcp 
src=30.30.30.1 srcPort=18003 dst=40.40.40.1 service=8080 host=FirewalName proto=tcp 
src=50.50.50.1 srcPort=21003 dst=60.60.60.1 service=161 host=FirewalName proto=udp''' 

是這樣的:

10.10.10.1 20.20.20.1 TCP 443 
30.30.30.1 40.40.40.1 TCP 8080 
50.50.50.1 60.60.60.1 UDP 161 
+0

不要忘記去接受它:) – ettanany

0

,你可以用一個正則表達式搜索做到這一點和替換,具有更簡單的模式。

正則表達式:

src=([\d\.]+).*dst=([\d\.]+).*service=(\d+).*proto=(.*) 

替換字符串:

$1 $2 $4 $3 

demo

+0

這個偉大的工程!我非常感謝你的幫助 – Clyde