J'ai plusieurs entrées qui décrivent un événement dans un très gros fichier journal, par exemple A.log . Je voudrais faire deux choses avec les entrées d' événement dans le fichier journal:
- Comptez le nombre d'occurrences de chacune de ces entrées (ce n'est pas une exigence obligatoire mais ce serait bien d'avoir).
- Extrayez les entrées réelles dans un fichier séparé et étudiez-les ultérieurement.
Une entrée d'événement typique ressemblerait à ce qui suit et aura d'autres textes entre eux. Ainsi, dans l'exemple ci-dessous, il y a deux entrées d' événement , la première contenant deux DataChangeEntry
charges utiles et la seconde contenant une DataChangeEntry
charge utile.
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, ]
]]
Veuillez noter que le nombre de ==== DataChangeEntry
lignes dans une entrée d'événement peut être variable. Il peut également être complètement absent, ce qui indiquerait une charge utile d'événements vide et constitue une condition d'erreur et aimerait certainement intercepter ce cas également.
Étant donné que dans ce cas, la sortie d'entrée s'étend sur plusieurs lignes, je ne vais pas loin en utilisant grep vanilla simple. Je recherche donc des conseils d'experts.
PS:
- Permettez-moi d'être plus explicite sur mon exigence. Je voudrais capturer l'intégralité du bloc de texte montré ci-dessus textuellement et éventuellement compter le nombre d'instances de ces blocs rencontrées. L'option de compter le nombre d'instances est bonne, mais n'est pas obligatoire.
- Si la solution au problème utilise awk, je voudrais enregistrer le fichier awk et le réutiliser. Veuillez donc également mentionner les étapes pour exécuter le script. Je connais regex et grep mais je ne connais pas sed et / ou awk.
la source
Data control raising event
?Réponses:
J'espère que cela le fera. Les événements vont dans le
events
fichier. Et les messages vont à stdout.Enregistrez ce fichier dans myprogram.awk (par exemple):
Vous pouvez l'invoquer de différentes manières:
myprogram.awk inputfile.txt
awk -f myprogram.awk inputfile.txt
Exemple de sortie:
Vous pouvez vérifier tous les événements ensemble dans le fichier appelé
events
dans le répertoire de travail.la source
awk -f findEvents.awk A.log
:?Une approche très simple serait
Cela créera un fichier séparé pour chaque entrée et imprimera le nombre d'entrées trouvées sur la sortie standard.
Explication
NR
est le numéro de ligne actuelawk
.RS="]]"
définit le séparateur d'enregistrement (ce qui définit une "ligne") sur]]
. Cela signifie que chaque entrée sera traitée comme une seule ligne parawk
.{print > NR".entry"}
: ceci imprime la ligne courante (entrée) dans un fichier appelé[LineNumber].entry
. Donc,1.entry
contiendra le 1er,2.entry
le second et ainsi de suite.END{print NR" entries"}
: le bloc END est exécuté après que tout le fichier d'entrée a été traité. Par conséquent, à ce stadeNR
sera le nombre d'entrées traitées.Vous pouvez l'enregistrer en tant qu'alias ou en faire un script comme ceci:
Vous devez ensuite exécuter le script (en supposant qu'il est appelé
foo.sh
et se trouve dans votre $ PATH) avec le fichier cible comme argument:Vous pouvez également modifier les noms des fichiers de sortie. Par exemple, pour que les fichiers soient appelés,
[date].[entry number].[entry]
utilisez plutôt ceci:Ce qui précède suppose que votre fichier journal se compose exclusivement d'entrées "Événement". Si ce n'est pas le cas et que vous pouvez avoir d'autres lignes et que ces lignes doivent être ignorées, utilisez plutôt ceci:
Ou, en une ligne:
la source