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 ==== DataChangeEntrylí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
eventsarchivo. Y los mensajes van a stdout.Guarde este archivo en myprogram.awk (por ejemplo):
Puede invocarlo de diferentes maneras:
myprogram.awk inputfile.txtawk -f myprogram.awk inputfile.txtSalida de muestra:
Puede verificar todos los eventos juntos en el archivo llamado
eventsen 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
NRes 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.entrycontendrá el primero,2.entryel 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 puntoNRserá 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.shy 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