[Tutor] Log file for to search in order

2019-01-11 Thread Asad
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 
> To: tutor@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" 
> To: tutor@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 f

Re: [Tutor] Log file for to search in order

2019-01-11 Thread Alan Gauld via Tutor
On 11/01/2019 14:12, Asad wrote:

Let metry and translate your description into pseudo code...

> >> 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

start = False
lines = []
with open(fname) as infile:
for line in infile:
lines.append(line)# or use a circular list size 4
if hasPattern(patt1,line):
   start = True
   break
if start and hasPattern(patt2, line):
   print lines[-4:]

Is that right so far?


>  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

This sounds like the same thing except with a different start pattern
and a different number of lines printed.
So may be its a function?

The only thing I'm not clear on is the comment "if it does not find the
above pattern"
Which pattern, there are two... do you mean the first one?

And if so do you need to search the entire file for the second pattern?
If so you need to repeat the search fuinction twice:

found = False
with open(fname) as infile:
   found = searchFile(infile, pattern1, buffsize=4)
   if not found:
  infile.seek(0)   # go back to beginning of file
  found = searchFile(infile,pattern2, buffsize=10)

> 3)  if it doesnot match  the pattern: 
> or   anywhere in the log file .
>
> print "No match found refer to install guide"

   if not found:
  print 


Does the above look like what you want?

> 4) If I have two errors how do I prioritize one above other ?

I have no idea. How do you prioritize them?
That's a requirement issue not a solution issue.

Once you tell us how you want to prioritize them we can
consider possible programming options.


-- 
Alan G
Author of the Learn to Program web site
http://www.alan-g.me.uk/
http://www.amazon.com/author/alan_gauld
Follow my photo-blog on Flickr at:
http://www.flickr.com/photos/alangauldphotos


___
Tutor maillist  -  Tutor@python.org
To unsubscribe or change subscription options:
https://mail.python.org/mailman/listinfo/tutor