У меня есть несколько записей, описывающих событие в очень большом файле журнала, например A.log . Я хотел бы сделать две вещи с записями событий в файле журнала:
- Подсчитайте количество вхождений каждой такой записи (это не является обязательным требованием, но было бы неплохо иметь его).
- Извлеките фактические записи в отдельный файл и изучите их позже.
Типичная запись о событии будет выглядеть следующим образом и будет содержать другие тексты между ними. Таким образом, в приведенном ниже примере есть две записи о событиях : первая содержит две DataChangeEntry
полезные нагрузки, а вторая - одну DataChangeEntry
полезную нагрузку.
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, ]
]]
Обратите внимание, что количество ==== DataChangeEntry
строк в записи события может быть переменным. Он также может полностью отсутствовать, что указывало бы на полезную нагрузку пустых событий и являлось условием ошибки, и определенно хотел бы также отследить этот случай.
Так как в этом случае выходные данные вошли в несколько строк, я не доберусь далеко, используя простой ванильный grep. Поэтому я ищу совет специалиста.
PS:
- Позвольте мне быть более ясным о моем требовании. Я хотел бы захватить весь блок текста, показанный выше, дословно и при желании подсчитать количество экземпляров таких блоков, с которыми встречались. Возможность подсчета количества экземпляров хороша, но не является обязательным требованием.
- Если для решения проблемы используется awk, я бы хотел сохранить файл awk и использовать его повторно. Поэтому, пожалуйста, укажите шаги для выполнения скрипта. Я знаю регулярные выражения и grep, но я не знаком с sed и / или awk.
Data control raising event
?