2015-05-26 50 views
-1

我正在使用Python脚本(由同事编写),该脚本将输出文件和ping命令的IP地址和结果擦除,以确定可触及的状态。问题:该脚本正在刮取子网掩码而不是主机IP。我不明白为什么正则表达式与IP地址不匹配。下面是代码和由脚本生成的输出文件的一个示例:在Python中读取IP地址

enter code here 


import glob 
import re 
from tkinter.filedialog import askdirectory 
from tkinter import Tk 
import os 
import ntpath 

new_file = [] 
results_file = [] 
success_file = [] 
failure_file = [] 
new_count = 0 
regex_clean = re.compile('ip address') 
regex_source = re.compile('ip address') 
regex_destination = re.compile('chos to') 
regex_success = re.compile('!') 
regex_failure = re.compile('\.\.\.\.\.|U\.U\.U') 
regex_ip_address = re.compile('\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}') 
regex_final_success = re.compile('SUCCESS') 
regex_final_failure = re.compile('FAILURE') 


def find_files(files_directory): 
    file_list = [] 
    os.chdir(files_directory) 
    for file in glob.glob("*.txt"): 
     # print(files_directory + '/' + file) 
     file_list.append(files_directory + '/' + file) 
    return file_list 


def clean_data(file): 
    with open(file, 'r') as f: 
     h = f.readlines() 
     for num, line in enumerate(h): 
      if regex_clean.search(line) is not None: 
       for line2 in h[num-1:num+12]: 
        new_file.append(line2) 
        # print(new_file) 
    return new_file 


def find_results(new_file): 
    for num, line in enumerate(new_file): 
     if regex_success.search(line) is not None: 
      test_status = 'SUCCESS!' 
      if test_status: 
       results_file.append('Test Status: ' + test_status) 
      # print(results_file) 
     if regex_failure.search(line) is not None: 
      test_status = 'FAILURE!' 
      if test_status: 
       results_file.append('Test Status: ' + test_status) 
      # print(results_file) 
     if regex_source.search(line) is not None: 
      source_address = regex_ip_address.findall(line) 
      if source_address: 
       for ip in source_address: 
        results_file.append('Configured Address: ' + ip) 
      # print(results_file) 
     if regex_destination.search(line) is not None: 
      destination_address = regex_ip_address.findall(line) 
      if destination_address: 
       for ip in destination_address: 
        results_file.append('Destination Address: ' + ip) 
      # print(results_file) 
    return results_file 


def create_final_files(results_file): 
    for num, line in enumerate(results_file): 
     # print(line) 
     # print("1") 
     if regex_final_success.search(line) is not None: 
      for line2 in results_file[num-2:num+1]: 
       success_file.append(line2) 
       # print('SUCCESS FILE') 
       # print("2") 
       # print(success_file) 
       # print('SUCCESS FILE') 
     elif regex_final_failure.search(line) is not None: 
      for line3 in results_file[num-2:num+1]: 
       failure_file.append(line3) 
       # print('FAILURE FILE') 
       # print("3") 
       # print(failure_file) 
       # print('FAILURE FILE') 
    return success_file, failure_file 


def clean_filename(file): 
    head, tail = ntpath.split(file) 
    return tail 


def create_output_files(success_file, failure_file, save_directory, filename): 
    success_filename = save_directory + "/SUCCESS_FILE.txt" 
    failure_filename = save_directory + "/FAILURE_FILE.txt" 

    with open(success_filename, 'a') as f: 
     f.write("\n\n") 
     f.write("SOURCE FILE: %s\n" % filename) 
     f.write("\n") 
     for item in success_file: 
      f.write("%s\n" % item) 

    with open(failure_filename, 'a') as f: 
     f.write("\n\n") 
     f.write("SOURCE FILE: %s\n" % filename) 
     f.write("\n") 
     for item in failure_file: 
      f.write("%s\n" % item) 


if __name__ == '__main__': 
    root = Tk() 
    print('Welcome to the quick REGEX script!') 
    print('This will take ping outputs and return the device IP addresses, and successes, failures in two files.\n') 
    print('Select directory containing ping files:') 
    files_directory = askdirectory() 
    print('FILE DIRECTORY: ' + files_directory) 
    print('\n') 
    print('Select directory to use for created files:') 
    save_directory = askdirectory() 
    print('SAVE DIRECTORY: ' + save_directory) 
    file_list = find_files(files_directory) 
    file_count = len(file_list) 
    print('TOTAL FILES: ' + str(file_count)) 
    # print(file_list) 
    for n, file in enumerate(file_list): 
     new_count = new_count + 1 
     percent_complete = (new_count/file_count) * 100 
     print('PERCENT COMPLETE: ' + str(percent_complete) + '%') 
     new_file = [] 
     results_file = [] 
     success_file = [] 
     failure_file = [] 
     # print(type(file)) 
     # print(file) 
     new_file = clean_data(file) 
     results_file = find_results(new_file) 
     results_file = find_results(new_file) 
     # print('RESULTS FILE') 
     # print (results_file) 
     # print('END OF RESULTS FILE') 
     success_file, failure_file = create_final_files(results_file) 
     # print('SUCCESS FILE') 
     # print(success_file) 
     # print('END OF SUCCESS FILE') 
     # print('FAILURE FILE') 
     # print(failure_file) 
     # print('END OF FAILURE FILE') 
     filename = clean_filename(file) 
     # print('FILE NAME: ' + filename) 
     create_output_files(success_file, failure_file, save_directory, filename) 
    print('COMPLETE!') 
    sleep(5) 

    root.destroy() 

源文件的样品:

sh run | include ip address 
ip address AAA.BBB.CCC.136 255.255.255.128 
ping AAA.BBB.67.97 

Type escape sequence to abort. 
Sending 5, 100-byte ICMP Echos to AAA.BBB.67.97, timeout is 2 seconds: 
!!!!! 
Success rate is 100 percent (5/5), round-trip min/avg/max = 142/142/143 ms 
ping AAA.BBB.75.97 

Type escape sequence to abort. 
Sending 5, 100-byte ICMP Echos to AAA.BBB.75.97, timeout is 2 seconds: 
!!!!! 
Success rate is 100 percent (5/5), round-trip min/avg/max = 134/134/135 ms 

示例脚本输出:

Configured Address: 255.255.255.192 
Destination Address: AAA.BBB.67.97 
Test Status: SUCCESS! 
Configured Address: 255.255.255.192 
Destination Address: AAA.BBB.67.97 
Test Status: SUCCESS! 
Test Status: SUCCESS! 
Destination Address: AAA.BBB.75.97 
Test Status: SUCCESS! 
Configured Address: 255.255.255.192 
Destination Address: AAA.BBB.67.97 
Test Status: SUCCESS! 
Configured Address: 255.255.255.192 
Destination Address: AAA.BBB.67.97 
Test Status: SUCCESS! 
Test Status: SUCCESS! 
Destination Address: AAA.BBB.75.97 
Test Status: SUCCESS! 
+0

你在问为什么一个像AAA.BBB.CCC.136'这样的输入字符串没有像'\ d {1,3} \。\ d {1,3} \。\ d { 1,3} \。\ d {1,3}'? – abarnert

+0

同时,请阅读[最小,完整,可验证的示例](http://stackoverflow.com/help/mcve)。将您的所有代码倾倒在我们身上,但没有说明代码的哪一部分是相关的并不是获得帮助的好方法。 – abarnert

+0

感谢您对所有代码的倾倒解释和抱歉;我不确定这个例子包含多少。当我上传问题时,我清理了IP地址;老习惯。我相对确定主机地址的第一个八位字节都是单个或两位数。如果我把第一个octect的正则表达式改为'\ d {1,2}',那么它会选择它吗? – BWCook

回答

0

该脚本正在刮取子网掩码而不是主机IP。 我不明白为什么正则表达式与IP地址不匹配。

您的正则表达式正在寻找3个由点分隔的十进制数(由1到3个数字组成)。所以它找到子网掩码“255.255.255.192”,而它找不到“AAA.BBB.67.97”。

顺便说一句,像“AAA.BBB.67.97”这样的字符串是而不是的IP地址。