[Tutor] Log file for to search in order
Asad
asad.hasan2004 at gmail.com
Fri Jan 11 09:12:07 EST 2019
Hi All ,
Let me answer :
> Where are you looking? *Anywhere* in the log file?
>> Yes anywhere in the log file .
> Only in the immediate next line? Anywhere forward of the "patch" line?
>> Anywhere forward from the line which matches the search
> You are looking for two patterns, but does the order they appear, or the
> distance apart, matter?
>
> Yes the order does matter :
1) first it looks for : \?/patch/\d{8}/\d{8}/admin/load.sql
- Condition if there are 10 lines containing the same pattern
then it should save and print the last line containing the pattern means
the 10th line
- if it find the above string it start searching from that line
with successful match regex match until it gets to the line containing
set_metadata
- Once it get the line containing set_metadata print last 4
lines prior to the line containing set_metadata
2) if it doesnot find the above pattern look for second in order
:Starting\s+apply\s+for\s+patch\s+\d{8}/\d{8}
- Condition if there are 10 lines containing the same pattern
then it should save and print the last line containing the pattern means
the 10th line
- if it find the above string it start searching from that line
with successful match regex match until it gets to the line containing
set_metadata
- Once it get the line containing set_metadata print last 10
lines prior to the line containing set_metadata
3) if it doesnot match the pattern: \?/patch/\d{8}/\d{8}/admin/load.sql
or '\?/patch/\d{8}/\d{8}/admin/load.sql' anywhere in the log file .
print "No match found refer to install guide"
4) If I have two errors how do I prioritize one above other ?
Thanks,
>
> ---------- Forwarded message ----------
> From: Asad <asad.hasan2004 at gmail.com>
> To: tutor at python.org
> Cc:
> Bcc:
> Date: Wed, 2 Jan 2019 20:39:53 +0530
> Subject: [Tutor] Log file for Nested if-elif
> Hi All ,
>
> Need advice on the following piece of code :
>
> with open(r"file1.log", 'r') as f:
> tail = deque(maxlen=8) # the last eight lines
> script = None
> for line in f:
> tail.append(line)
> if
> re.search('\?/patch/\d{8}/\d{8}/admin/load.sql',line,re.IGNORECASE):
> script = line
> elif re.search(r'Starting\s+apply\s+for\s+patch\s+\d{8}/\d{8}',
> line, re.IGNORECASE):
> script = line
> elif re.search(r'set_metadata', line ,re.IGNORECASE) is not None:
> print "Reason of error \n", tail[-1]
> print "Script:\n", script
> print "Block of code:\n"
> for item in tail:
> print item
> print " Danger "
> break
> Now this is printing the last cached line in the variable line . However
> I would like to see the following output :
>
> 1) if it matches the pattern: \?/patch/\d{8}/\d{8}/admin/load.sql then
>
> look for the line "set_metadata" in the file1.log if it finds the pattern
> then print the line which matches the pattern
> \?/patch/\d{8}/\d{8}/admin/load.sql
>
> print last 4 lines of the tail array and exit
>
> 2) if it doesnot match '\?/patch/\d{8}/\d{8}/admin/load.sql'
>
> then look of the anothern pattern
> :Starting\s+apply\s+for\s+patch\s+\d{8}/\d{8} if it find the pattern
>
> then look for line "set_metadata" in the file1.log if it finds the pattern
> then print the line which matches the pattern
> \?/patch/\d{8}/\d{8}/admin/load.sql
>
> print all the lines in tail
>
> print a recommendation "Please check the installation"
>
>
> 3 ) if it doesnot match the pattern: \?/patch/\d{8}/\d{8}/admin/load.sql
> or '\?/patch/\d{8}/\d{8}/admin/load.sql'
>
> print "No match found refer to install guide"
>
> Can you advice what I can do to change the code .
>
> Thanks,
> --
>
>
>
>
> ---------- Forwarded message ----------
> From: "Steven D'Aprano" <steve at pearwood.info>
> To: tutor at python.org
> Cc:
> Bcc:
> Date: Thu, 3 Jan 2019 15:16:45 +1100
> Subject: Re: [Tutor] Log file for Nested if-elif
> On Wed, Jan 02, 2019 at 08:39:53PM +0530, Asad wrote:
> > Hi All ,
> >
> > Need advice on the following piece of code :
>
> Let me write it in a more "Pythonic" style:
>
>
>
> PATCH = r'\?/patch/\d{8}/\d{8}/admin/load.sql'
> APPLY = r'Starting\s+apply\s+for\s+patch\s+\d{8}/\d{8}'
> ERROR = r'set_metadata'
>
> tail = deque(maxlen=8) # the last eight lines
> script = None
> with open("file1.log", 'r') as f:
> for line in f:
> tail.append(line)
> if (re.search(PATCH, line, re.IGNORECASE)
> or re.search(APPLY, line, re.IGNORECASE):
> script = line
> elif re.search(ERROR, line, re.IGNORECASE):
> print "Reason for error \n", line
> print "Script:", script
> print "Tail:\n", tail
> print " Danger " # Seriously? This is dangerous?
> break
>
>
> > Now this is printing the last cached line in the variable line .
> However
> > I would like to see the following output :
> >
> > 1) if it matches the pattern: \?/patch/\d{8}/\d{8}/admin/load.sql then
> > look for the line "set_metadata" in the file1.log if it finds the
> pattern
> > then print the line which matches the pattern
> > \?/patch/\d{8}/\d{8}/admin/load.sql
>
> Where are you looking? *Anywhere* in the log file? Only in the
> immediate next line? Anywhere forward of the "patch" line? You are
> looking for two patterns, but does the order they appear, or the
> distance apart, matter?
>
>
> blah blah blah set_metadata blah blah
> ... 100 lines ...
> blah blah blah /patch/ ... admin/load.sql
> ... 100 lines ...
>
> Is that a match?
>
> > print last 4 lines of the tail array and exit
>
> print tail[-4:]
> sys.exit()
>
>
>
> > 2) if it doesnot match '\?/patch/\d{8}/\d{8}/admin/load.sql'
> >
> > then look of the anothern pattern
> > :Starting\s+apply\s+for\s+patch\s+\d{8}/\d{8} if it find the pattern
> >
> > then look for line "set_metadata" in the file1.log if it finds the
> pattern
> > then print the line which matches the pattern
> > \?/patch/\d{8}/\d{8}/admin/load.sql
>
> This is a contradiction: you just said that it DOESN'T match the
> patch...load.sql pattern, but now you want it to print the line that
> matched. There is no line that matches!
>
> > 3 ) if it doesnot match the pattern: \?/patch/\d{8}/\d{8}/admin/load.sql
> > or '\?/patch/\d{8}/\d{8}/admin/load.sql'
> >
> > print "No match found refer to install guide"
> >
> > Can you advice what I can do to change the code .
>
>
>
> You need to tighten the specifications to make it more clear what you
> are trying to do.
>
>
>
> --
> Steve
>
>
>
>
> ---------- Forwarded message ----------
> From: Peter Otten <__peter__ at web.de>
> To: tutor at python.org
> Cc:
> Bcc:
> Date: Thu, 03 Jan 2019 12:11:08 +0100
> Subject: Re: [Tutor] Log file for Nested if-elif
> Asad wrote:
>
> > Hi All ,
> >
> > Need advice on the following piece of code :
> >
> > with open(r"file1.log", 'r') as f:
> > tail = deque(maxlen=8) # the last eight lines
> > script = None
> > for line in f:
> > tail.append(line)
> > if
> > re.search('\?/patch/\d{8}/\d{8}/admin/load.sql',line,re.IGNORECASE):
> > script = line
> > elif re.search(r'Starting\s+apply\s+for\s+patch\s+\d{8}/\d{8}',
> > line, re.IGNORECASE):
> > script = line
> > elif re.search(r'set_metadata', line ,re.IGNORECASE) is not None:
> > print "Reason of error \n", tail[-1]
> > print "Script:\n", script
> > print "Block of code:\n"
> > for item in tail:
> > print item
> > print " Danger "
> > break
> > Now this is printing the last cached line in the variable line .
> However
> > I would like to see the following output :
> >
> > 1) if it matches the pattern: \?/patch/\d{8}/\d{8}/admin/load.sql then
> >
> > look for the line "set_metadata" in the file1.log if it finds the
> pattern
> > then print the line which matches the pattern
> > \?/patch/\d{8}/\d{8}/admin/load.sql
> >
> > print last 4 lines of the tail array and exit
> >
> > 2) if it doesnot match '\?/patch/\d{8}/\d{8}/admin/load.sql'
> >
> > then look of the anothern pattern
> > :Starting\s+apply\s+for\s+patch\s+\d{8}/\d{8} if it find the pattern
> >
> > then look for line "set_metadata" in the file1.log if it finds the
> > pattern then print the line which matches the pattern
> > \?/patch/\d{8}/\d{8}/admin/load.sql
> >
> > print all the lines in tail
> >
> > print a recommendation "Please check the installation"
> >
> >
> > 3 ) if it doesnot match the pattern: \?/patch/\d{8}/\d{8}/admin/load.sql
> > or '\?/patch/\d{8}/\d{8}/admin/load.sql'
> >
> > print "No match found refer to install guide"
> >
> > Can you advice what I can do to change the code .
>
> You have "nested" in the subject, do not make an attempt to structure your
> loop. Why is that?
>
> In my experience using lots of small functions makes code easier to
> understand. Below is a suggestion how you might break up your code.
>
> # untested; expect a few bugs!
> def with_tail(items, maxlen):
> tail = deque(maxlen=maxlen)
>
> def gen_items():
> for item in items:
> tail.append(item)
> yield item
>
> return tail, gen_items()
>
>
> def search_end_of_section(lines):
> for line in lines:
> if re.search(r'set_metadata', line, re.IGNORECASE) is not None:
> break
> else:
> raise ValueError("Reached end of file...panic!")
>
>
> def dump(script, tail, advice=None):
> print "Reason of error \n", tail[-1]
> print "Script:\n", script
> print "Block of code:\n"
> for item in tail[-limit:]:
> print item
> print " Danger "
> if advice is not None:
> print advice
>
>
> RE_PATCH = re.compile(r'\?/patch/\d{8}/\d{8}/admin/load.sql',
> re.IGNORECASE)
> RE_APPLY = re.compile(
> r'Starting\s+apply\s+for\s+patch\s+\d{8}/\d{8}', re.IGNORECASE
> )
>
> with open(r"file1.log", 'r') as f:
> tail, lines = with_tail(f)
> for line in lines:
> if RE_PATCH.search(line) is not None:
> search_end_of_section(lines)
> dump(script=line, tail=tail[-4:])
> break
> elif RE_APPLY.search(line) is not None:
> search_end_of_section(lines)
> dump(
> script=line, tail=tail,
> advice="Please check the installation"
> )
> break
>
>
>
> _______________________________________________
> Tutor maillist - Tutor at python.org
> https://mail.python.org/mailman/listinfo/tutor
>
--
Asad Hasan
+91 9582111698
More information about the Tutor
mailing list