Ayuda para formateao de registros.

Todo lo relacionado con REXX en este ambiente.
Responder
artilla
Usuario
Usuario
Mensajes: 6
Registrado: 01 Ago 2017, 13:08
País: españa
Ciudad: barcelona
Ocupación: Consultor

Ayuda para formateao de registros.

Mensaje por artilla » 06 Feb 2018, 18:17

Buenas tardes, me encuentro en un pequeño callejon en el que no consigo sacar la información que requiero.
El LOG lo tengo copiado en un fichero llamado LOG.USER1.FECHA y lo que necesito es recoger desde la primera linea hasta el final del archivo desde la posición 20 (en la primera linea es donde esta ICH70001I ) hasta el final del mensaje sin recoger ningún dato mas. y así linea por linea, lo que quiero es almacenar todos los mensajes para poder realizar una búsqueda un poco mas efectiva.

me podríais echar una mano?? Gracias!!




JOB06837 00000090 ICH70001I STCUSR LAST ACCESS AT 23:55:00 ON WEDNESD
2018
00000290 IEF196I IEF237I JES2 ALLOCATED TO SYSLOG30
STC06836 00000290 - -----TIMINGS (
-----PAGING COUNTS----
STC06836 00000290 -STEPNAME PROCSTEP RC EXCP CONN TCB
SERV WORKLOAD PAGE SWAP VIO SWAPS
STC06836 00000290 - IEFPROC 00 19 9 .00
146 WLSTC 0 0 0 0
STC06836 00000290 -JOB ENDED. NAME- TOTAL TCB
TOTAL ELAPSED TIME= .0 SUBSYS=STC
00000290 IEF196I IEF285I +MASTER+.SYSLOG.STC03339.D0000330.?
STC06836 00000090 $HASP395 JOB ENDED
SYSLOG 00000000 IEE042I SYSTEM LOG DATA SET INITIALIZED
00000090 IEE043I A SYSTEM LOG DATA SET HAS BEEN QUEUED TO SYSO
JOB06837 00000090 $HASP373 BKPDLYA0 STARTED - INIT 2 - CLASS C

Avatar de Usuario
jlanderos
Usuario
Usuario
Mensajes: 18
Registrado: 26 Sep 2017, 18:21
País: México
Ciudad: CDMX
Ocupación: IT Specialist

Re: Ayuda para formateao de registros.

Mensaje por jlanderos » 06 Mar 2018, 22:08

Hola:

No entiendo muy bien lo que debes de hacer. Pero me parece que básicamente lo que necesitas es extraer los "X" mensajes del log del sistema.

Hace tiempo elaboré un pequeño programa que hacía eso por necesidades del lugar. Búsqueda de errores, mensajes para depurar que aparecen en el sistema y cosas por el estilo. Básicamente lo que hace es "rastrear" el mensaje(s) proporcionado por pase de parámetros y guardarlo en una salida. El programa debe de ser llamado desde BATCH y el formato de busqueda debe ser exactamente idéntico al del SYSLOG.

Código: Seleccionar todo

/* REXX */                                                                      
/*****************************************************************************/ 
/*    Programa que tiene como función buscar textos en SYSLOG.               */ 
/*                                                                           */ 
/*  PROGRAMA: GETMSGLG                                                       */ 
/*                                                                           */ 
/*  VAR. Y/O PROG. DE LOS QUE DEPENDE:                                       */ 
/*         * Programa que depende de ser llamado vía BATCH bajo ciertos      */ 
/*          criterios:                                                       */ 
/*           + Definición de DDNAME "DDIN" para definir la información a     */ 
/*            utilizar como datos de entrada.                                */ 
/*           + Definición de DDNAME "DDOUT" para definir la información      */ 
/*            resultante de la búsqueda realizada.                           */ 
/*                                                                           */ 
/*  OBJETIVO: Lectura de mensajes normales y multilínea dentro de Log del    */ 
/*           Sistema. Se utiliza el Id del mensaje como referencia de        */ 
/*           búsqueda.                                                       */ 
/*                                                                           */ 
/*  FUNCIONAMIENTO: Programa que funciona vía batch obteniendo de la DDNAME  */ 
/*        DDIN los datos de entrada para la búsqueda y arrojando el          */ 
/*        resultado de ésta en la DDANME "DDOUT". El o los mensajes a        */ 
/*        buscar son proporcionados vía páse de parámetros al programa.      */ 
/*          Los códigos de retorno válidos son:                              */ 
/*                                                                           */ 
/*          * CC 0000.- La búsqueda encontró información.                    */ 
/*          * CC 0004.- No se ha encontrado información.                     */ 
/*                                                                           */ 
/*           Ejemplo de llamado.                                             */ 
/* _________________________________________________________________________ */ 
/* ++                                                                     ++ */ 
/* ++                                                                     ++ */ 
/* ++  //SRCHSYSL  JOB (0000),'BUSQUEDA DE MSG',                          ++ */ 
/* ++  //            NOTIFY=&SYSUID,REGION=0M,                            ++ */ 
/* ++  //            MSGLEVEL=(1,1),CLASS=A                               ++ */ 
/* ++  //***********************************************************//    ++ */ 
/* ++  ////PROGREXX EXEC PGM=IKJEFT1B,DYNAMNBR=100                        ++ */ 
/* ++  //SYSEXEC  DD DISP=SHR,DSN=<<referencia del programa>>             ++ */ 
/* ++  //DDIN      DD DISP=SHR,DSN=<<Archivo de entrada>>                 ++ */ 
/* ++  //DDOUT     DD DISP=(,CATLG,CATLG),DSN=<<Archivo de salida>>,      ++ */ 
/* ++  //        UNIT=3390,SPACE=(TRK,(60,120),RLSE),                     ++ */ 
/* ++  //        DCB=(RECFM=FB,LRECL=133,BLKSIZE=1330)                    ++ */ 
/* ++  //SYSTSPRT DD   SYSOUT=*                                           ++ */ 
/* ++  //SYSTSIN  DD   *                                                  ++ */ 
/* ++    %GETMSGLG <<MsgNo1>> <<MsgNo2>> <<MsgNon>>                       ++ */ 
/* ++  //                                                                 ++ */ 
/* |_______________________________________________________________________| */ 
/*                                                                           */ 
/*          Por último la DDNAME "SYSTSPRT" muestra un resumen del           */ 
/*        funcionamiento del programa y la información resultante del mismo. */ 
/*                                                                           */ 
/*                                                                           */ 
/*  ELABORÓ:                                                                 */ 
/*    USUARIO: xxxxxxx  NOMBRE: JLS                                          */ 
/*      FECHA: 09-Nov-2016                                                   */ 
/*                                                                           */ 
/*  MODIFICACIONES:                                                          */ 
/*                                                                           */ 
/*         USUARIO: _______  NOMBRE: _______________________                 */ 
/*           FECHA: dd-Mmm-aaaa                                              */ 
/*         AJUSTES:                                                          */ 
/*                                                                           */ 
/*                                                                           */ 
/*****************************************************************************/ 
                                                                                
parse arg MsgId                                                                 
                                                                                
"EXECIO 0 DISKR DDIN (OPEN"  /* ABRE EL ARCHIVO */                              
RCode = rc                                                                      
if RCode <> 0 then do                                                           
  say 'Error abriendo archivo. RC='rc                                           
  exit 12                                                                       
end                                                                             
                                                                                
RowId. = ''  /* Arreglo de mensajes a almacenar */                              
IxRowId = 0  /* Puntero de mensajes a almacenar */                              
IxRow = 0    /* Puntero de archivo */                                           
Nxt_Row = '' /* Id de continuación de linea */                                  
Flag = 0     /* Bandera de almacenamiento de información */                     
ArrMsg. = '' /* Arreglo de mensajes a buscar */                                 
IxMsg = 0    /* Puntero arreglo de mensajes a buscar */                         
Cont = 1     /* Contador temporal */                                            
Flg_NxtRow = 0 /* Bandera de busqueda de continuación de línea */               
                                                                                
  /* Valida información de mensajes a buscar */                                 
if words(MsgId) > 0 then do                                                     
  do until MsgId = ''                                                           
    IxMsg = IxMsg + 1                                                           
                                                                                
    ArrMsg.IxMsg = word(MsgId, 1)                                               
    MsgId = subword(MsgId, 2)                                                   
  end /* Fin de Loop "UNTIL" */                                                 
end                                                                             
else do                                                                         
  say 'Error en pase de argumentos.'                                            
  exit 12                                                                       
end                                                                             
/* trace i */                                                                   
  /* Lectura de Archivo de entrada */                                           
do until RCode <> 0                                                             
  "EXECIO 1 DISKR DDIN (STEM RowIn." /* Lee registro por registros */           
  RCode = rc                                                                    
  if RCode = 0 then do                                                          
    IxRow = IxRow + 1         /* Puntero de archivo leido */                    
                                                                                
    Cont = 1                                                                    
    do while (ArrMsg.Cont <> '') /* Busca mensaje en línea */                   
      if pos(ArrMsg.Cont, RowIn.1) > 0 then do                                  
        Flg_NxtRow = 1                                                          
        Flag = 1 /* Se ha encontrado el msg a buscar */                         
        leave                                                                   
      end                                                                       
      Cont = Cont + 1                                                           
    end /* Fin de Sentencia "UNTIL" */                                          
                                                                                
      /* Evalúa sí existe continuación de línea a almacenar */                  
    if Flg_NxtRow then do                                                       
      if pos(ArrMsg.Cont, RowIn.1) > 0 then do                                  
        IxRowId = IxRowId + 1                                                   
        RowId.IxRowId = RowIn.1                                                 
        Nxt_Row = word(RowIn.1, words(RowIn.1))  /* Id continuación de línea */ 
      end                                                                       
      else do                                                                   
        if (Nxt_Row = word(RowIn.1, 2)) & (words(Rowin.1) > 2) then do          
          IxRowId = IxRowId + 1                                                 
          RowId.IxRowId = RowIn.1                                               
        end                                                                     
        else do                                                                 
          Nxt_Row = ''                                                          
          Flg_NxtRow = 0                                                        
        end                                                                     
      end                                                                       
    end /* Fin de condición "Flg_NxtRow" */                                     
  end                                                                           
end /* Fin de bucle "WHILE" */                                                  
if RCode = 2 then Rcode = 0                                                     
"EXECIO 0 DISKR DDIN (FINIS"  /* Cierra archivo */                              
"FREE DD(DDIN)"                                                                 
                                                                                
say center(' Estadisticas de Lectura ', 130, '-')                               
say ' '                                                                         
say '    No. Mensajes a buscar >>' right(IxMsg, 10)                             
say ' '                                                                         
Cont = 1                                                                        
do while Cont <= IxMsg                                                          
  say ' *' ArrMsg.Cont                                                          
  Cont = Cont + 1                                                               
end                                                                             
say ' '                                                                         
say ' '                                                                         
say '   Total de lineas leidas >>' right(IxRow, 13)                             
say 'Total de lineas extraidas >>' right(IxRowId, 13)                           
say ' '                                                                         
say center('  RC =' rc ' ', 130, '-')                                           
                                                                                
if Flag then do                                                                 
  "EXECIO * DISKW DDOUT (FINIS STEM RowId."  /* Escribe y cierra archivo */     
  RCode = rc                                                                    
  if (RCode = 0) | (Rcode = 2) then do                                          
    RCode = 0                                                                   
    "FREE DD(DDOUT)" /* Libera apuntador */                                     
  end                                                                           
  else do                                                                       
    say 'Error abriendo archivo. RC='RCode                                      
    "EXECIO * DISKR DDOUT (FINIS"  /* Cierra archivo */                         
    "FREE DD(DDOUT)" /* Libera apuntador */                                     
    exit RCode                                                                  
  end                                                                           
end                                                                             
else  RCode = 4 /* No se encontraron datos a extraer */                         
                                                                                
exit RCode                                                                      

Espero sea lo que necesitas. Suerte :arriba:


El camino de 1,000 kms inicia con un solo paso.

Avatar de Usuario
Vicente
Colaborador avanzado
Colaborador avanzado
Mensajes: 540
Registrado: 21 Jul 2011, 04:52
País: España
Ciudad: Malaga
Ocupación: Técnico en Sistemas

Re: Ayuda para formateao de registros.

Mensaje por Vicente » 22 Mar 2018, 10:58

El siguiente mandato de línea del editor de ISPF desplaza 20 columnas hacia la izquierda, un bloque de líneas:

((20
.
.
.
((

Un saludo
Varios días probando, equivocandote y volviendo a probar
pueden ahorrarte quince minutos de lectura de un manual.

Responder