オプションのセクションを含むテキストブロックを探す

オプションのセクションを含むテキストブロックを探す

説明する項目がいくつかあります。イベント非常に大きなログファイルで、次のように言います。丸太。私は2つのことをしたいです。イベントログファイルのエントリ:

  1. 各項目の発生回数を計算します。 (必須事項ではありませんが、あれば良いようです。)
  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を使用して遠くに行きませんでした。だから専門家のアドバイスを求めています。

添付:

  1. 私の要件をより明確に説明します。上記のフルテキストブロックをそのままキャプチャし、オプションでそのブロックが発生したインスタンスの数を計算したいと思います。インスタンス数を計算するオプションは良いですが、必須ではありません。
  2. 問題の解決策がawkを使用している場合は、awkファイルを保存して再利用したいと思います。したがって、スクリプトを実行する手順にも言及してください。私はregexとgrepを知っていますが、sedやawkには慣れていません。

ベストアンサー1

私はこれができることを願っています。イベントはファイルに保存されますevents。メッセージは標準出力に送信されます。

このファイルをmyprogram.awkに保存します(例:)。

#!/usr/bin/awk -f

BEGIN {
   s=0;  ### state. Active when parsing inside an event
   nevent=0;  ### Current event number
   printf "" > "events"
}

# Start of event
/^ *Data control raising event/ {
   s=1;
   dentries=0;
   print "*** Event number: " nevent >> "events"
   nevent++
}

# Standard event line
s==1 {
   print >> "events"
}

# DataChangeEntry line
/^ *==== DataChangeEntry/ {
   dentries ++
}

# End of event
s==1 && /^ *\]\]/ {
   s=0;
   print "" >> "events"
   if(dentries==0){
      print "Warning: Event " nevent " has no Data Entries"
   }
}

END {
   print "Total event count: " nevent
}

さまざまな方法で呼び出すことができます。

  • myprogram.awk inputfile.txt
  • awk -f myprogram.awk inputfile.txt

出力例:

Warning: Event 3 has no Data Entries
Total event count: 3

作業ディレクトリ内のファイル内のすべてのイベントを一緒にスキャンできますevents

おすすめ記事