如何比较两个信息相同但顺序不同的文本文件



前言:我对脚本/编程非常陌生,我将其作为一种学习工具来使用,这将对工作有所帮助。

我制作了一个小的python 2.7脚本,每天运行nmap ping扫描,看看我的服务器是否启动并运行。

脚本运行良好,但由于服务器回复的滞后性,我的最终比较失败了,它最终使列表与比较的基线列表不同。

例如:

Baseline.txt包含以下信息

Host:10.0.1.2 status up
Host:10.0.1.3 status up
Host:10.0.1.4 status up
Host:10.0.1.5 status up

当脚本运行时,由于滞后,将返回以下内容:

Host:10.0.1.5 status up
Host:10.0.1.2 status up
Host:10.0.1.4 status up
Host:10.0.1.3 status up

信息是相同的,但顺序不同,脚本会将两个文件视为不同的,并报告发生了更改。(我使用一个简单的if语句进行比较,这可能是我的问题)

有没有一种方法可以迭代文件的每一行,将其与基线文件的每行进行比较,如果信息存在,让它在没有更改的情况下读取它?还是我完全做错了?

如果需要的话,下面是代码:

import smtplib
#Method for emailing if a problem arises
def notify():
SMTP_SERVER = 'smtp.gmail.com'
SMTP_PORT = 587
sender = 'SERVER_ALERT@company.com'
recipient = 'me@me.com'
subject = 'SERVER STATUS ALERT'
body = 'Check all servers for an unscheduled change!'
body = "" + body + ""
headers = ["From: " + sender,
"Subject: " + subject, 
"To: " + recipient, 
"MIME-Version: 1.0",
"Content-Type: text/html"]
headers = "rn".join(headers)
session = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
session.ehlo()
session.starttls()
session.login('notify_me@me.com', 'password')
session.sendmail(sender, recipient, headers + "rnrn" + body)
session.quit()
#Scanning with nmap and naming the scan the date
timestr = time.strftime("%m-%d-%y")
daily_scan = open(timestr+".txt", 'w')
os.system("nmap -sn -iL ip_list.txt -oG scan.txt")
scan_data = open("scan.txt", 'r').readlines()
#Checking for changes
for line in scan_data:
if "Host:" in line:
daily_scan.write(str(line))
daily_scan.close()
os.system('rm scan.txt')
baseline = open('baseline.txt', 'r').readlines()
daily_check = open(timestr+".txt", 'r').readlines()
if baseline == daily_check:
exit()
else:
notify()
>>> b = open('baseline.txt').readlines()
>>> r = open('return.txt').readlines()
>>> b == sorted(r)
True

为了进行防御性编程,以防将来对代码进行某些更改,使baseline.txt未排序,我们可以使用以下测试:

sorted(b) == sorted(r)

最后,你可能会想要比简单的平等测试更具信息性的东西。考虑:

problems = [ line for line in r if line not in b ]
if problems:
notify()
else:
exit()

这为problems分配了与基线相比的任何变化,换句话说,r中在b中没有显示不变的任何行。此代码不依赖于排序。如果没有出现问题的行,则计算结果为false,代码退出。如果r中的任何行不同,则调用notify。为了提供更多信息输出,可以将problems的列表传递给notify

如果您将最后一行替换为

if sorted(baseline) == sorted(daily_check):
exit()

你可以得到你想要的。

最新更新