2015-05-26 71 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地址。