我是编程新手,我需要帮助。我之前已经问过类似的问题,但我发现的只是两个txt文件之间的数据匹配。
我有两个txt文件(Aout.txt和Bout.txt),我使用python从日志文件中提取数据。
Aout.txt和Bout.txt都有类似的数据,需要交叉此信息并获取finaloutput.txt
这里是Aout.txt的样本:
----------------------------
Thu Nov 2 15:53:19 2017 Info: New SMTP ICID 111111 interface (1.2.3.4) address 5.6.7.8 reverse dns host verified yes
Thu Nov 2 15:53:21 2017 Info: MID 22222 ICID 111111 From: <example@test.com>
Thu Nov 2 15:53:23 2017 Info: MID 22222 ICID 111111 RID 0 To: <receive@acme.com>
Thu Nov 2 15:53:27 2017 Info: MID 22222 Subject 'TEST'
----------------------------
Bout.txt的样本:
----------------------------
1509654863.891601 info msg 22222 : bytes 332 from <example@test.com> qp 0 uid 0
1509654864.031506 starting delivery 654321: msg 22222 to remote receive@acme.com
1509654864.863334 delivery 654321: success: 9.8.7.6_accepted_message./Remote_host_said:_250_2.6.0_<123@mailserver.com>_[InternalId=1122334455]_Queued_mail_for_delivery/
----------------------------
我需要查看msg&#39; Number&#39;来自Bout.txt与MID&#39; Number&#39;相同来自Aout.txt。如果它们匹配,那么我需要检查来自Bout.txt的该消息是否有传递成功。如果为true,则finaloutpout将是Aout.txt中第一行的相同消息
finaloutput.txt:
----------------------------
Thu Nov 2 15:53:19 2017 Info: New SMTP ICID 111111 interface (1.2.3.4) address 5.6.7.8 reverse dns host verified yes
----------------------------
如果我能得到
address 5.6.7.8
本身在不同的输出文件中。这将是完美的。
我确实计算了成功的输出消息,它们已超过4600并且正在增加。
任何帮助都将受到赞赏,我使用的是python 2.7
感谢。
我使用这些代码来提取Aout.txt和Bout.txt
import os
import glob
indir="C:\\Users\\Mail Logs"
os.chdir(indir)
list_of_files = glob.glob('*') # create the list of file
FO = open("C:\\Users\\Result\\Aout.txt", 'w')
file_list=[]
for file_name in list_of_files:
file_list.append(file_name)
for file_name in file_list:
FI = open(file_name, 'r')
for line in FI:
if 'New SMTP ICID' in line:
FO.write('\n')
FO.write("\n----------------------------\n")
FO.write('\n')
FO.write(line)
elif 'From:' in line:
FO.write(line)
elif 'To:' in line:
FO.write(line)
elif 'Subject' in line:
FO.write(line)
FI.close()
FO.close()
和Bout.txt
import os
import glob
indir="C:\\Users\\Qmail logs"
os.chdir(indir)
list_of_files = glob.glob('*') # create the list of file
FO = open("C:\\Users\\Result\\Bout.txt", 'w')
file_list=[]
for file_name in list_of_files:
file_list.append(file_name)
for file_name in file_list:
FI = open(file_name, 'r')
for line in FI:
if 'info msg' in line:
FO.write('\n')
FO.write("\n----------------------------\n")
FO.write('\n')
FO.write(line)
elif 'starting delivery' in line:
FO.write(line)
elif 'success' in line:
FO.write(line)
elif 'deferral' in line:
FO.write(line)
elif 'failure' in line:
FO.write(line)
FI.close()
FO.close()
答案 0 :(得分:0)
首先,您可以立即开始将问题分解为几个更小,更易于管理的工作块。你有许多假定的操作。
您将搜索,比较,提取和写入磁盘。不幸的是,基于所提供的信息,搜索将是解决方案中效率最低的部分。
您必须分析两组数据。你应该首先编写函数来处理这个而不是攻击问题。分而治之!
def scan_log_file(file, search_term):
# Scan over the given input and determine if the search term is present
....
# Your implementation here
def extract_host(data):
# Return your host address from the input data
...
return address
def extract_message_id(data):
# given a line that may include the message id, search it
...
return message_id
def write_file_data(filename, data):
# Here you append data to the file you want
...
因此,实际搜索文件数据。您可以使用正则表达式来很好地实现这一点。如果你不熟悉它们,现在是了解它们的好时机。它们在您的工具带中非常有用。
例如,您可以使用以下内容查找邮件ID:
import re
results = re.search('address (\d\.\d.\d.\d)')
results.group(0) # get the first accepted group, i.e the host address
您可以迭代第一个数据集,提取消息ID,然后对第二个集执行扫描,提取主机地址,将第一个集的比较写入文件finaloutput.txt,将主机地址写入文件host_results.txt。
这是一个相当天真的实现。但它应该让你开始。我不确定你的文件最终会变得多大,但我还建议你查看生成器,以便在较小的流中逐位读取日志文件,而不是将大量数据集批量加载到内存中
但与现有评论非常相似。可以根据您的数据假设进行优化。它可以预测吗?是否需要进行转换,格式化等...
我建议稍微填写一下你的问题,以便更好地了解问题的范围和细节