Saya memiliki beberapa entri yang menjelaskan peristiwa dalam file log yang sangat besar, katakan A.log . Saya ingin melakukan dua hal dengan entri acara dalam file log:
- Hitung jumlah kemunculan setiap entri tersebut. (Ini bukan persyaratan wajib tapi akan menyenangkan untuk dimiliki.)
- Ekstrak entri aktual dalam file terpisah dan pelajari nanti.
Entri acara yang khas akan terlihat seperti berikut dan akan memiliki teks lain di antara mereka. Jadi, dalam contoh di bawah ini ada dua entri acara , yang pertama berisi dua DataChangeEntry
muatan dan yang kedua berisi satu DataChangeEntry
muatan.
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, ]
]]
Harap dicatat bahwa jumlah ==== DataChangeEntry
baris dalam entri acara dapat bervariasi. Itu juga bisa benar-benar tidak ada yang akan menunjukkan muatan acara kosong dan merupakan kondisi kesalahan dan pasti ingin menangkap kasus ini juga.
Karena dalam hal ini output dari entri membentang di beberapa baris saya tidak terlalu jauh menggunakan plain vanilla grep. Jadi saya mencari saran ahli.
PS:
- Biarkan saya lebih eksplisit tentang kebutuhan saya. Saya ingin menangkap seluruh blok teks yang ditunjukkan di atas kata demi kata dan secara opsional menghitung jumlah instance dari blok yang ditemui. Pilihan untuk menghitung jumlah instance adalah baik untuk dimiliki tetapi bukan persyaratan wajib.
- Jika solusi untuk masalah ini menggunakan awk, saya ingin menyimpan file awk dan menggunakannya kembali. Jadi tolong sebutkan langkah-langkah untuk menjalankan skrip juga. Saya tahu regex dan grep tetapi saya tidak terbiasa dengan sed dan / atau awk.
sumber
Data control raising event
?Jawaban:
Saya harap ini akan melakukannya. Acara pergi ke
events
file. Dan pesan pergi ke stdout.Simpan file ini ke myprogram.awk (misalnya):
Anda dapat memohonnya dengan berbagai cara:
myprogram.awk inputfile.txt
awk -f myprogram.awk inputfile.txt
Output sampel:
Anda dapat memeriksa semua acara bersama di file yang dipanggil
events
di direktori kerja.sumber
awk -f findEvents.awk A.log
:?Pendekatan yang sangat sederhana
Ini akan membuat file terpisah untuk setiap entri dan mencetak jumlah entri yang ditemukan ke output standar.
Penjelasan
NR
adalah nomor baris saat ini diawk
.RS="]]"
mengatur pemisah rekaman (apa yang mendefinisikan "garis") menjadi]]
. Ini berarti bahwa setiap entri akan diperlakukan sebagai satu baris olehawk
.{print > NR".entry"}
: ini mencetak baris saat ini (entri) ke dalam file bernama[LineNumber].entry
. Jadi,1.entry
akan berisi 1,2.entry
yang kedua dan seterusnya.END{print NR" entries"}
: blok END dijalankan setelah seluruh file input diproses. Oleh karena itu, pada saat ituNR
akan ada jumlah entri yang diproses.Anda dapat menyimpan ini sebagai alias atau membuatnya menjadi skrip seperti:
Anda kemudian menjalankan skrip (dengan asumsi itu dipanggil
foo.sh
dan berada di $ PATH Anda) dengan file target sebagai argumen:Anda juga dapat mengubah nama file output. Misalnya, agar file dipanggil
[date].[entry number].[entry]
gunakan ini sebagai gantinya:Di atas mengasumsikan bahwa file log Anda secara eksklusif terdiri dari entri "Acara". Jika bukan itu masalahnya, dan Anda bisa memiliki baris lain, dan baris itu harus diabaikan, gunakan ini sebagai gantinya:
Atau, sebagai one-liner:
sumber