Ho più voci che descrivono un evento in un file di registro molto grande, ad esempio A.log . Vorrei fare due cose con le voci dell'evento nel file di registro:
- Conta il numero di occorrenze di ciascuna di queste voci (questo non è un requisito obbligatorio ma sarebbe bello avere).
- Estrarre le voci effettive in un file separato e studiarle in seguito.
Una voce tipica dell'evento sarebbe simile alla seguente e conterrà altri testi. Quindi nell'esempio seguente ci sono due voci di evento , la prima contenente due DataChangeEntry
payload e la seconda contenente un DataChangeEntry
payload.
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, ]
]]
Si noti che il numero di ==== DataChangeEntry
righe in una voce di evento può essere variabile. Può anche essere completamente assente, il che indica un payload di eventi vuoti ed è una condizione di errore e vorrebbe sicuramente prendere anche questo caso.
Dato che in questo caso l'output di entry si estende su più righe, non sto andando molto lontano usando plain vanilla grep. Quindi cerco il consiglio di un esperto.
PS:
- Vorrei essere più esplicito sul mio requisito. Vorrei catturare l'intero blocco di testo mostrato sopra alla lettera e facoltativamente contare il numero di istanze di tali blocchi riscontrati. L'opzione per contare il numero di istanze è buona ma non è obbligatoria.
- Se la soluzione al problema utilizza awk, vorrei salvare il file awk e riutilizzarlo. Quindi, per favore, menziona i passaggi per eseguire anche lo script. Conosco regex e grep ma non ho familiarità con sed e / o awk.
Data control raising event
?