如何过滤嵌套的案例以过滤掉python



我有一个ascii纯文本文件输入文件,其中包含主大小写和嵌套大小写,如下所示:我想比较下面输入文件中以"$"开头的细节和@ExtendedAttr=nvp_add函数之间的实例,针对开关下的每个案例($specific trap),但当我在python脚本下运行脚本时,所有嵌套的案例也都会打印出来,我不希望嵌套的案例在这里打印出来,脚本只考虑开关下的案例($special case)。我该怎么帮你!:

Input file:
************
case ".1.3.6.1.4.1.27091.2.9": ###  - Notifications from JNPR-TIMING-MIB (1105260000Z)
    log(DEBUG, "<<<<< Entering... juniper-JNPR-TIMING-MIB.include.snmptrap.rules 
 >>>>>")
    @Agent = "JNPR-TIMING-MIB"
    @Class = "40200"
    $OPTION_TypeFieldUsage = "3.6"
    switch($specific-trap)
    {
        case "1": ### trapMsgNtpStratumChange
            ##########
            # $1 = trapAttrSource
            # $2 = trapAttrSeverity
            ##########
             $trapAttrSource = $1
             $trapAttrSeverity = lookup($2, TrapAttrSeverity)
             $OS_EventId = "SNMPTRAP-juniper-JNPR-TIMING-MIB-trapMsgNtpStratumChange"
             @AlertGroup = "NTP Stratum Status"
             @AlertKey = "Source: " + $trapAttrSource
             @Summary = "NTP Stratum Changes" + " ( " + @AlertKey + " ) "
        switch($2)
        {
            case "1":### clear
                $SEV_KEY = $OS_EventId + "_clear"
                @Summary = "End of: " + @Summary
                $DEFAULT_Severity = 1
                $DEFAULT_Type = 2
                $DEFAULT_ExpireTime = 0
            case "2":### none
                $SEV_KEY = $OS_EventId + "_none"
                $DEFAULT_Severity = 2
                $DEFAULT_Type = 1
                $DEFAULT_ExpireTime = 0
            case "3":### minor
                $SEV_KEY = $OS_EventId + "_minor"
                $DEFAULT_Severity = 3
                $DEFAULT_Type = 1
                $DEFAULT_ExpireTime = 0
            case "4":### major
                $SEV_KEY = $OS_EventId + "_major"
                $DEFAULT_Severity = 4
                $DEFAULT_Type = 1
                $DEFAULT_ExpireTime = 0
            case "5":### critical
                $SEV_KEY = $OS_EventId + "_critical"
                $DEFAULT_Severity = 5
                $DEFAULT_Type = 1
                $DEFAULT_ExpireTime = 0
            default:
                $SEV_KEY = $OS_EventId + "_unknown"
                $DEFAULT_Severity = 2
                $DEFAULT_Type = 1
                $DEFAULT_ExpireTime = 0
        }
        update(@Severity)
        $trapAttrSeverity = $trapAttrSeverity + " ( " + $2 + " )"
        @Identifier = @Node + " " + @AlertKey + " " + @AlertGroup + " " + 
      $DEFAULT_Type + " " + @Agent + " " + @Manager + " " + $specific-trap
        if(match($OPTION_EnableDetails, "1") or match($OPTION_EnableDetails_juniper,
      "1")) {
            details($trapAttrSource,$trapAttrSeverity)
        }
        @ExtendedAttr = nvp_add(@ExtendedAttr, "trapAttrSource", $trapAttrSource, 
     "trapAttrSeverit")
    case "2": ### trapMsgNtpLeapChange
        ##########
        # $1 = trapAttrSource
        # $2 = trapAttrSeverity
        ##########
        $trapAttrSource = $1
        $trapAttrSeverity = lookup($2, TrapAttrSeverity)
        $OS_EventId = "SNMPTRAP-juniper-JNPR-TIMING-MIB-trapMsgNtpLeapChange"
        @AlertGroup = "NTP Leap Status"
        @AlertKey = "Source: " + $trapAttrSource
        @Summary = "NTP Leap Changes" + " ( " + @AlertKey + " ) "
        switch($2)
        {
            case "1":### clear
                $SEV_KEY = $OS_EventId + "_clear"
                @Summary = "End of: " + @Summary
                $DEFAULT_Severity = 1
                $DEFAULT_Type = 2
                $DEFAULT_ExpireTime = 0
            case "2":### none
                $SEV_KEY = $OS_EventId + "_none"
                $DEFAULT_Severity = 2
                $DEFAULT_Type = 1
                $DEFAULT_ExpireTime = 0
            case "3":### minor
                $SEV_KEY = $OS_EventId + "_minor"
                $DEFAULT_Severity = 3
                $DEFAULT_Type = 1
                $DEFAULT_ExpireTime = 0
            case "4":### major
                $SEV_KEY = $OS_EventId + "_major"
                $DEFAULT_Severity = 4
                $DEFAULT_Type = 1
                $DEFAULT_ExpireTime = 0
            case "5":### critical
                $SEV_KEY = $OS_EventId + "_critical"
                $DEFAULT_Severity = 5
                $DEFAULT_Type = 1
                $DEFAULT_ExpireTime = 0
            default:
                $SEV_KEY = $OS_EventId + "_unknown"
                $DEFAULT_Severity = 2
                $DEFAULT_Type = 1
                $DEFAULT_ExpireTime = 0
        }
        update(@Severity)
        $trapAttrSeverity = $trapAttrSeverity + " ( " + $2 + " )"
        @Identifier = @Node + " " + @AlertKey + " " + @AlertGroup + " " + 
        $DEFAULT_Type + " " + @Agent + " " + @Manager + " " + $specific-trap
        if(match($OPTION_EnableDetails, "1") or match($OPTION_EnableDetails_juniper, 
       "1")) {
            details($trapAttrSource,$trapAttrSeverity)
        }
        @ExtendedAttr = nvp_add(@ExtendedAttr, "trapAttrSource", $trapAttrSource, 
       "trapAttrSeverity", $trapAttrSeverity)

Below is the code which I use suggested by Vaibhav Aggarwal one of the member in 
this stakeoverflow.
Python Script
**************
 import re

`caselines_index = []
 cases = []
 readlines = []
 def read(in_file):
 global cases
 global caselines_index
 global readlines
 with open(in_file, 'r') as file:
    for line in file.readlines():
       readlines.append(line.strip())
    for line in readlines:
       case_search = re.search("cases".+?":s", line)
         if case_search:
           caselines_index.append(readlines.index(line))
#print caselines_index
caselines_index_iter = iter(caselines_index)
int_line_index = int(next(caselines_index_iter))
int_next_index = int(next(caselines_index_iter))
while True:
  try:
    case_text = ' '.join(readlines[int_line_index:int_next_index]).strip()
    case = [readlines[int_line_index].strip(), case_text]
    cases.append(case)
    int_line_index = int_next_index
    int_next_index = int(next(caselines_index_iter))
  except StopIteration:
    case_text = ' '.join(readlines[int_line_index:len(readlines) - 1]).strip()
    case = [readlines[int_line_index].strip(), case_text]
    cases.append(case)
    break
def work():
  MATCH = 1
   for case_list in cases:
     details = []
     nvp_add = []
     caseline = case_list[0].strip()
     nvp = re.findall("details(.+?)", case_list[1].strip())
    for item in nvp:
        result_list = re.findall("($.+?)[,)]", item)
    for result in result_list:
        if "$*" not in result:
            details.append(result)
    nvp = re.findall("nvp_add(.+?)", case_list[1].strip())
    for item in nvp:
       result_list = re.findall("($.+?)[,)]", item)
    for result in result_list:
       if "$*" not in result:
          nvp_add.append(result)
missing_from_details, missing_from_nvp_add = [], []
missing_from_details = [o for o in nvp_add if o not in set(details)]
missing_from_nvp_add = [o for o in details if o not in set(nvp_add)]
if missing_from_nvp_add or missing_from_details:
  MATCH = 0
  print caseline + "   LINE - " + str(readlines.index(caseline) + 1)
  for mismatch in missing_from_details:
    print "Missing from details:"
    print mismatch
  for mismatch in missing_from_nvp_add:
    print "Missing from nvp_add:"
    print mismatch
  print "n"
 if MATCH == 1:
   print "MATCH"
 else:
   print "MISMATCHES"

def main():
  in_file = "C:/target1.txt"
  read(in_file)
  work()

if __name__=="__main__":
main()
import re
from sys import stdout
#stdout = open("result.txt", 'w+')

def read(in_file):
  cases = []
  caselines_index = []
  readlines = []
  readlines_num = []
  with open(in_file, 'r') as file:
    readfile = file.read().strip()
    for line in readfile.split('n'):
      readlines_num.append(line.strip())
    regex = re.compile("switch($d).+?}", re.DOTALL)
    readfile = re.sub(regex, ' ', readfile)
    for line in readfile.split('n'):
      readlines.append(line.strip())
    for line in readlines:
      case_search = re.search("cases".+?":s", line)
      if case_search:
        caselines_index.append(readlines.index(line))
    #print caselines_index
    caselines_index_iter = iter(caselines_index)
    try:
      int_line_index = int(next(caselines_index_iter))
    except:
      print "No cases found"
    try:
      int_next_index = int(next(caselines_index_iter))
    except:
      int_next_index = len(readlines) - 1
    while True:
      try:
        case_text = ' '.join(readlines[int_line_index:int_next_index]).strip()
        match1 = re.search("nvp_add", case_text)
        match2 = re.search("details", case_text)
        if match1 or match2:
          case = [readlines[int_line_index].strip(), readlines_num.index(readlines[int_line_index]) + 1, case_text]
          cases.append(case)
        int_line_index = int_next_index
        int_next_index = int(next(caselines_index_iter))
      except StopIteration:
        case_text = ' '.join(readlines[int_line_index:len(readlines) - 1]).strip()
        case = [readlines[int_line_index].strip(), readlines_num.index(readlines[int_line_index]), case_text]
        cases.append(case)
        break
  return cases
def work(cases):
  MATCH = 1
  for case_list in cases:
    details = []
    nvp_add = []
    caseline = case_list[0].strip()
    nvp = re.findall("details(.+?)", case_list[2].strip())
    for item in nvp:
      result_list = re.findall("($.+?)[,)]", item)
      for result in result_list:
        if "$*" not in result:
          details.append(result)
    nvp = re.findall("nvp_add(.+?)", case_list[2].strip())
    for item in nvp:
      result_list = re.findall("($.+?)[,)]", item)
      for result in result_list:
        if "$*" not in result:
          nvp_add.append(result)
    missing_from_details, missing_from_nvp_add = [], []
    missing_from_details = [o for o in nvp_add if o not in set(details)]
    missing_from_nvp_add = [o for o in details if o not in set(nvp_add)]
    if missing_from_nvp_add or missing_from_details:
      MATCH = 0
      print caseline + "   LINE - " + str(case_list[1] + 1)
      for mismatch in missing_from_details:
        print "Missing from details:"
        print mismatch
      for mismatch in missing_from_nvp_add:
        print "Missing from nvp_add:"
        print mismatch
      print "n"
  if MATCH == 1:
    print "MATCH"
  else:
    print "MISMATCHES"

def main():
  in_file = "target1.txt"
  cases = read(in_file)
  work(cases)

if __name__=="__main__":
  main()

这将过滤掉所有嵌套的开关。这只适用于您的输入文件。

最新更新