非常に大きなログファイル、たとえばA.logにイベントを説明する複数のエントリがあります。ログファイルのイベントエントリで2つのことを実行したいと思います。
- そのような各エントリの出現回数をカウントします(これは必須の要件ではありませんが、持っていると便利です)。
- 実際のエントリを別のファイルに抽出し、後で調べます。
典型的なイベントエントリは次のようになり、その間に他のテキストがあります。以下の例では、2つのイベントエントリがあり、最初のエントリには2つのDataChangeEntry
ペイロードが含まれ、2番目のイベントには1 つの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
ますか?