搜索带有可选部分的文本块

Gee*_*eek 8 grep sed awk text-processing

我有多个条目描述了一个非常大的日志文件中的事件,比如A.log。我想对日志文件中的事件条目做两件事:

  1. 计算每个此类条目的出现次数。(这不是强制性要求,但最好有。)
  2. 将实际条目提取到一个单独的文件中,稍后再研究它们。

一个典型的事件条目如下所示,它们之间会有其他文本。所以在下面的例子中有两个事件条目,第一个包含两个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,  ]

    ]]
Run Code Online (Sandbox Code Playgroud)

请注意,==== DataChangeEntry事件条目中的行数 可以是可变的。它也可以完全不存在,这表示事件负载为空,并且是一个错误条件,并且肯定也想捕获这种情况。

由于在这种情况下 entry 的输出跨越多行,因此我使用普通的 grep 并没有走多远。所以我正在寻求专家的建议。

PS:

  1. 让我更明确地说明我的要求。我想逐字捕获上面显示的整个文本块,并可以选择计算遇到的此类块的实例数。计算实例数量的选项很好,但不是强制性要求。
  2. 如果问题的解决方案是使用 awk,我想保存 awk 文件并重新使用它。因此,请同时提及执行脚本的步骤。我知道 regex 和 grep,但我不熟悉 sed 和/或 awk。

Lat*_*SuD 4

我希望这能做到。事件进入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
}
Run Code Online (Sandbox Code Playgroud)

您可以通过不同的方式调用它:

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

示例输出:

Warning: Event 3 has no Data Entries
Total event count: 3
Run Code Online (Sandbox Code Playgroud)

events您可以在工作目录中调用的文件中一起检查所有事件。