У меня есть несколько записей, описывающих событие в очень большом файле журнала, например 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
?Ответы:
Это сделало бы это, я надеюсь. События идут в
events
файл. И сообщения отправляются на стандартный вывод.Сохраните этот файл в myprogram.awk (например):
Вы можете вызвать его по-разному:
myprogram.awk inputfile.txt
awk -f myprogram.awk inputfile.txt
Пример вывода:
Вы можете проверить все события вместе в файле, который вызывается
events
в рабочем каталоге.источник
awk -f findEvents.awk A.log
?Очень простой подход будет
Это создаст отдельный файл для каждой записи и напечатает количество найденных записей для стандартного вывода.
объяснение
NR
текущий номер строки вawk
.RS="]]"
устанавливает разделитель записей (что определяет «строку») в]]
. Это означает, что каждая запись будет рассматриваться как одна строкаawk
.{print > NR".entry"}
: это печатает текущую строку (запись) в файл с именем[LineNumber].entry
. Итак,1.entry
будет содержать 1-е,2.entry
второе и т. Д.END{print NR" entries"}
: блок END выполняется после обработки всего входного файла. Следовательно, в этот моментNR
будет обработано количество записей.Вы можете сохранить это как псевдоним или превратить в скрипт следующим образом:
Затем вы должны запустить скрипт (при условии, что он
foo.sh
вызывается и находится в вашем $ PATH) с целевым файлом в качестве аргумента:Вы также можете настроить имена выходных файлов. Например, чтобы вызвать файлы,
[date].[entry number].[entry]
используйте это вместо:Выше предполагается, что ваш файл журнала состоит исключительно из записей «Событие». Если это не так, и у вас могут быть другие строки, и эти строки следует игнорировать, используйте вместо этого:
Или, как однострочник:
источник