OS2 World.Com Forum
2012.02.09, 17:05:06 *
Welcome, Guest. Please login or register.

Login with username, password and session length
News:
 
   Home   Help Search Login Register  
Pages: [1]
  Print  
Author Topic: Remove multiple occurances from a log file  (Read 846 times)
jep
Global Moderator
Sr. Member
*****
Posts: 388


View Profile
« on: 2010.01.08, 14:06:58 »

Marked as: Easy
Hi,

This script display the output from the log it read through StdErr and not the usual StdOut, so you can redirect the output to another file if you like.  Grin

Purpose (script):
Remove duplicate entries and display only one to the user. Output data as it appear in the log file.

Prerequisite:
A file that contain a lot of different information repeated over several times at various locations within the file. Each section has to begin with the text "ERROR:" or "WARNING:" (without the quotes).

Purpose (for you to learn about):
Difference between StdErr and StdOut and how to redirect output.
See Rexx Tips & Tricks for more information.

Usage (redirect errors to new log file named cleaned.log):
read_log my_log_with_duplicates.log 2 > cleaned.log

Output (screen):
Reading file: my_log_with_duplicates.log
File my_log_with_duplicates.log has been read

Output (log file "cleaned.log"):
Contents of the log file cleaned to only contain one occurrence of each log entry (See further sown for example).
Usage (all output to screen):
read_log my_log_with_duplicates.log

Code:
/* Short test script for the function below (read_log.cmd) */
Say 'Reading file:' ARG(1)
retval = parse_log( ARG(1) )
SAY 'File 'ARG(1)' has been read'
Return retval

parse_log: PROCEDURE
    IF ARG(2) <> '' THEN
        counter = counter + 1
    ELSE counter = 0
    IF STREAM( ARG(1), 'C', 'QUERY EXISTS' ) = '' THEN
        Return 4
    ELSE IF \STREAM( ARG(1), 'C', 'READABLE' ) THEN
    DO
         /* Log file could not be read */
        CALL SysSleep 1
         /* try for 5 minutes (expressed in seconds) */
        IF counter < 60 * 5 THEN
            CALL parse_log ARG(1), 1
        ELSE
            Return 5
    END
    f_size = STREAM( ARG(1), 'C', 'QUERY SIZE' )
    IF f_size > 0 THEN DO
        f_input = CHARIN( ARG(1), 1, f_size )
        CALL STREAM ARG(1), 'C', 'CLOSE'
        isProblem = 0
        delim.1 = 'ERROR:'
        delim.2 = 'WARNING:'
        delim.0 = 2
        DO i = 1 TO delim.0
            isDelim = POS( delim.i, f_input )
            isProblem = ( isProblem | ( isDelim > 0 ) )
            DO WHILE isDelim > 0
                INTERPRET 'PARSE VALUE f_input WITH "'||delim.i||'"pre"'||delim.i'"post'
                IF LENGTH( post ) > 0 THEN f_input = delim.i||post
                IF LENGTH( STRIP( pre ) ) > 0 THEN
                DO
                    pre = delim.i||pre
                    CALL LINEOUT 'STDERR', STRIP( pre )
                    count = COUNTSTR( pre, f_input )
                    DO count
                        f_input = DELSTR( f_input, POS( pre, f_input ), LENGTH( pre ) )
                    END
                END
                isDelim = POS( delim.i, f_input )
            END
        END
    END
Return isProblem

//Jan-Erik

Example file:
WARNING:
Please check the power cable

ERROR:
This is an error cause by a faulty drive...

ERROR:
This is an error cause by a faulty drive...

WARNING:
Please check the power cable

ERROR:
This is an error cause by a faulty drive...

ERROR:
This is an error cause by a faulty drive...

WARNING:
Please check the power cable

WARNING:
Please check the power cable


Output:
ERROR:
This is an error cause by a faulty drive...
WARNING:
Please check the power cable


« Last Edit: 2010.01.08, 14:12:00 by jep » Logged
Pages: [1]
  Print  
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.14 | SMF © 2006-2011, Simple Machines LLC Valid XHTML 1.0! Valid CSS!