Tengo varias entradas que describen un evento en un archivo de registro muy grande, digamos A.log . Me gustaría hacer dos cosas con las entradas de eventos en el archivo de registro:
- Cuente el número de ocurrencias de cada una de estas entradas (este no es un requisito obligatorio, pero sería bueno tenerlo).
- Extraiga las entradas reales en un archivo separado y estudielas más adelante.
Una entrada de evento típica sería similar a la siguiente y tendrá otros textos entre ellas. Entonces, en el ejemplo a continuación hay dos entradas de eventos , la primera que contiene dos DataChangeEntry
cargas útiles y la segunda que contiene una DataChangeEntry
carga útil.
Data control raising event :DataControl@263c015d[[
#### DataChangeEvent #### on [DataControl name=PatternMatch_LegendTimeAxis, binding=.dynamicRegion1. beam_project_PatternMatch_dashboard_LegendTimeAxis_taskflow_LegendTimeAxis_beamDashboardLegendTimeAxisPageDef_beam_project_PatternMatch_dashboard_LegendTimeAxis_taskflow_LegendTimeAxis_beamDashboardLegendTimeAxis_xml_ps_taskflowid.dynamicRegion58. beam_project_PatternMatch_view_LegendTimeAxis_taskflow_LegendTimeAxis_beamVizLegendTimeAxisPageDef_beam_project_PatternMatch_view_LegendTimeAxis_taskflow_LegendTimeAxis_beamVizLegendTimeAxis_xml_ps_taskflowid.QueryIterator]
Filter/Collection Id : 0
Collection Level : 0
Sequence Id : 616
ViewSetId : PatternMatch.LegendTimeAxis_V1_0_SN49
==== DataChangeEntry (#1)
ChangeType : UPDATE
KeyPath : [2014-06-26 06:15:00.0, 0]
AttributeNames : [DATAOBJECT_CREATED, COUNTX, QueryName]
AttributeValues : [2014-06-26 06:15:00.0, 11, StrAvgCallWaitTimeGreaterThanThreshold]
AttributeTypes : [java.sql.Timestamp, java.lang.Integer, java.lang.String, ]
==== DataChangeEntry (#2)
ChangeType : UPDATE
KeyPath : [2014-06-26 06:15:00.0, 0]
AttributeNames : [DATAOBJECT_CREATED, COUNTX, QueryName]
AttributeValues : [2014-06-26 06:15:00.0, 9, AverageCallWaitingTimeGreateThanThreshold]
AttributeTypes : [java.sql.Timestamp, java.lang.Integer, java.lang.String, ]
]]
someother non useful text
spanning multiple lines
Data control raising event :DataControl@263c015d[[
#### DataChangeEvent #### on [DataControl name=PatternMatch_LegendTimeAxis, binding=.dynamicRegion1. beam_project_PatternMatch_dashboard_LegendTimeAxis_taskflow_LegendTimeAxis_beamDashboardLegendTimeAxisPageDef_beam_project_PatternMatch_dashboard_LegendTimeAxis_taskflow_LegendTimeAxis_beamDashboardLegendTimeAxis_xml_ps_taskflowid.dynamicRegion58. beam_project_PatternMatch_view_LegendTimeAxis_taskflow_LegendTimeAxis_beamVizLegendTimeAxisPageDef_beam_project_PatternMatch_view_LegendTimeAxis_taskflow_LegendTimeAxis_beamVizLegendTimeAxis_xml_ps_taskflowid.QueryIterator]
Filter/Collection Id : 0
Collection Level : 0
Sequence Id : 616
ViewSetId : PatternMatch.LegendTimeAxis_V1_0_SN49
==== DataChangeEntry (#1)
ChangeType : UPDATE
KeyPath : [2014-06-26 06:15:00.0, 0]
AttributeNames : [DATAOBJECT_CREATED, COUNTX, QueryName]
AttributeValues : [2014-06-26 06:15:00.0, 11, StrAvgCallWaitTimeGreaterThanThreshold]
AttributeTypes : [java.sql.Timestamp, java.lang.Integer, java.lang.String, ]
]]
Tenga en cuenta que el número de ==== DataChangeEntry
líneas en una entrada de evento puede ser variable. También puede estar completamente ausente, lo que indicaría una carga útil de eventos vacía y es una condición de error y definitivamente también me gustaría detectar este caso.
Como en este caso la salida de la entrada se extiende a través de varias líneas, no estoy llegando lejos usando grep simple de vainilla. Por eso estoy buscando consejos de expertos.
PD:
- Déjame ser más explícito sobre mi requerimiento. Me gustaría capturar todo el bloque de texto que se muestra arriba textualmente y, opcionalmente, contar el número de instancias de dichos bloques encontrados. Es bueno tener la opción de contar el número de instancias, pero no es un requisito obligatorio.
- Si la solución al problema es usar awk, me gustaría guardar el archivo awk y volver a usarlo. Por lo tanto, mencione los pasos para ejecutar el script también. Sé regex y grep pero no estoy familiarizado con sed y / o awk.
fuente
Data control raising event
?Respuestas:
Esto lo haría, espero. Los eventos van a
events
archivo. Y los mensajes van a stdout.Guarde este archivo en myprogram.awk (por ejemplo):
Puede invocarlo de diferentes maneras:
myprogram.awk inputfile.txt
awk -f myprogram.awk inputfile.txt
Salida de muestra:
Puede verificar todos los eventos juntos en el archivo llamado
events
en el directorio de trabajo.fuente
awk -f findEvents.awk A.log
:?Un enfoque muy simple sería
Esto creará un archivo separado para cada entrada e imprimirá el número de entradas encontradas en la salida estándar.
Explicación
NR
es el número de línea actual enawk
.RS="]]"
establece el separador de registros (lo que define una "línea") en]]
. Esto significa que cada entrada será tratada como una sola línea porawk
.{print > NR".entry"}
: esto imprime la línea actual (entrada) en un archivo llamado[LineNumber].entry
. Por lo tanto,1.entry
contendrá el primero,2.entry
el segundo y así sucesivamente.END{print NR" entries"}
: el bloque END se ejecuta después de que se haya procesado todo el archivo de entrada. Por lo tanto, en ese puntoNR
será el número de entradas procesadas.Puede guardar esto como un alias o convertirlo en un script de esta manera:
Luego ejecutaría el script (suponiendo que se llama
foo.sh
y está en su $ PATH) con el archivo de destino como argumento:También puede modificar los nombres de los archivos de salida. Por ejemplo, para llamar los archivos,
[date].[entry number].[entry]
use esto en su lugar:Lo anterior supone que su archivo de registro consta exclusivamente de entradas de "Evento". Si ese no es el caso, y puede tener otras líneas, y esas líneas deben ignorarse, use esto en su lugar:
O, como una frase:
fuente