ericdat
Goto Top

Zeilen automatisch vergleichen

Hallo, ich bin ein Neuling in Linux und wollte ein Shell script schreiben.

Ich habe eine CSV-Datei, die wie folgt aussieht:

major TDMA (1.08772) WaitExecRxHopBdetEna: timeout Case100/IDU16
major TDMA (1.08772) WaitExecRxHopBdetEna: timeout Case100/IDU16
major TDMA (1.08772) WaitExecRxHopBdetEna: timeout Case114/IDU11
major TDMA (1.08772) WaitExecRxHopBdetEna: timeout Case114/IDU11
major TDMA (1.08772) WaitExecRxHopBdetEna: timeout Case114/IDU11
major TDMA (1.08772) WaitExecRxHopBdetEna: timeout Case114/IDU11
major TDMA (1.08772) WaitExecRxHopBdetEna: timeout Case114/IDU11
major TDMA (1.08772) WaitExecRxHopBdetEna: timeout Case114/IDU11
major TDMA (1.08772) WaitExecRxHopBdetEna: timeout Case114/IDU11
major TDMA (1.08772) WaitExecRxHopBdetEna: timeout Case114/IDU11
major TDMA (1.04893) Wrong rxTm Case114/IDU16
major TDMA (1.08772) WaitExecRxHopBdetEna: timeout Case139/IDU14
major TDMA (1.08772) WaitExecRxHopBdetEna: timeout Case139/IDU14
major TDMA (1.08772) WaitExecRxHopBdetEna: timeout Case139/IDU14
major TDMA (1.08772) WaitExecRxHopBdetEna: timeout Case139/IDU14
major TDMA (1.08772) WaitExecRxHopBdetEna: timeout Case4/IDU15
major TDMA (1.08772) WaitExecRxHopBdetEna: timeout Case4/IDU15
major TDMA (1.08772) WaitExecRxHopBdetEna: timeout Case55/IDU13
major TDMA (1.08772) WaitExecRxHopBdetEna: timeout Case87/IDU16
major TDMA (1.08772) WaitExecRxHopBdetEna: timeout Case87/IDU16
major TDMA (1.08772) WaitExecRxHopBdetEna: timeout Case87/IDU16
major TDMA (1.08772) WaitExecRxHopBdetEna: timeout Case87/IDU16
minor TDMA (1.00942) ComputeRTT: RTT Case101/IDU11
minor TDMA (1.00942) ComputeRTT: RTT Case101/IDU11
minor TDMA (1.00942) ComputeRTT: RTT Case101/IDU12
minor TDMA (1.00942) ComputeRTT: RTT Case101/IDU12
minor TDMA (1.00942) ComputeRTT: RTT Case101/IDU15
minor TDMA (1.04152) Following suppressed Case106/IDU11
minor TDMA (1.04152) TransmTask: SatMux Case106/IDU11
minor TDMA (1.04152) Following suppressed Case106/IDU15
minor TDMA (1.04152) TransmTask: SatMux Case106/IDU15
minor TDMA (1.00942) ComputeRTT: RTT Case110/IDU13
minor TDMA (1.00942) ComputeRTT: RTT Case110/IDU14
minor TDMA (1.01123) ExtrapolateRtt: extrapol Case110/IDU16
minor TDMA (1.01123) ExtrapolateRtt: extrapol Case110/IDU16
minor TDMA (1.01123) ExtrapolateRtt: extrapol Case110/IDU16
minor TDMA (1.01916) txActPlanGener: txTimeQueue Case136/IDU12
minor TDMA (1.01916) txActPlanGener: txTimeQueue Case136/IDU12
minor TDMA (1.01916) txActPlanGener: txTimeQueue Case136/IDU12
minor TDMA (1.07290) ServerTask: periodic Case17/IDU16
minor TDMA (1.07290) ServerTask: periodic Case18/IDU13
minor TDMA (1.07290) ServerTask: periodic Case3/IDU15
minor TDMA (1.07290) ServerTask: periodic Case32/IDU16
minor TDMA (1.07290) ServerTask: periodic Case61/IDU14
critical TDMA (1.07415) Fallback timeout: Case100/IDU11
critical TDMA (1.07415) Fallback timeout: Case100/IDU13
critical TDMA (1.07415) Fallback timeout: Case100/IDU14
critical TDMA (1.06388) HdlKeepAliveMsg: RxTask Case100/IDU16
critical TDMA (1.06388) HdlKeepAliveMsg: RxTask Case100/IDU16
critical TDMA (1.06388) HdlKeepAliveMsg: RxTask Case100/IDU16
critical TDMA (1.06388) HdlKeepAliveMsg: RxTask Case100/IDU16
critical TDMA (1.07415) Fallback timeout: Case101/IDU11
critical TDMA (1.07415) Fallback timeout: Case101/IDU12
critical TDMA (1.07415) Fallback timeout: Case101/IDU13
critical TDMA (1.07415) Fallback timeout: Case101/IDU14
critical TDMA (1.07415) Fallback timeout: Case101/IDU15
critical TDMA (1.08396) FpgaRxErrInt: rtcTck Case101/IDU16
critical TDMA (1.08396) FpgaRxErrInt: rtcTck Case101/IDU16
critical TDMA (1.08396) FpgaRxErrInt: rtcTck Case101/IDU16
critical TDMA (1.08396) FpgaRxErrInt: rtcTck Case101/IDU16
critical TDMA (1.08396) FpgaRxErrInt: rtcTck Case101/IDU16


Alle Zeilen sollen automatisch mit einnander vergleichen werden, und die Zeilen, die die gleiche ersten vier "spalten" ( z.B: major TDMA (1.04893) Wrong ) haben, in einer neue Datei speichert werden sollen.Und wenn auch gleiche Casex/IDUy -> nur eine Casex/IDUx(und wieviel) speichern

Das erwartetes Ergebnis:

1. major TDMA (1.08772) WaitExecRxHopBdetEna:

Case100/IDU16 x2
Case114/IDU11 x8
Case139/IDU14 x4
Case4/IDU15 x2
Case55/IDU13
Case87/IDU16 x4
Häufigkeit: 21

2. major TDMA (1.04893) Wrong rxTm

Case114/IDU16

Häufigkeit: 1

3. minor TDMA (1.00942) ComputeRTT: RTT

Case101/IDU11 x2

4. minor TDMA (1.04152) Following suppressed
Case106/IDU11
Case106/IDU15
Häufigkeit: 2

5. minor TDMA (1.04152) TransmTask: SatMux
Case106/IDU11
Case106/IDU15
Häufigkeit: 2


Danke im voraus und Gruß

Content-Key: 114607

Url: https://administrator.de/contentid/114607

Printed on: April 25, 2024 at 08:04 o'clock

Mitglied: 77559
77559 Apr 24, 2009 at 13:00:28 (UTC)
Goto Top
Hallo ericdat,

du möchtest selbst ein Script schreiben und hast detaillierte Anforderungen.
Aus Erfahrung weiss ich, das man lernt wenn man sich selber hineinkniet. Mit meinen bescheidenen bash Kenntnissen helfe ich gerne weiter, wenn Du an einer Stelle nicht weiterkommst - aber es soll ja dein Script sein.

Ich glaube das du mit awk deine Anforderungen eher erfüllen kannst, aber mir fehlt im Moment die Zeit/das Interesse mich da genauer einzulesen.

Gruß
LotPings
Member: ericdat
ericdat Apr 24, 2009 at 13:58:44 (UTC)
Goto Top
HI Lotpings,
ich verstehe was du meinst .

Ich habe gerade mit Linux angefangt um eine Aufgabe zu lösen. ich habe 600 logfiles in verschiedene Ordner (Case1...190 / IDU1...6), und jede Logfile könnte Fehlermeldungen haben. Diese Fehlermeldungen sollen in einer Datei aufgelistet ( wo hat der Fehler aufgetaucht /Case?/IDU?, Häufigkeit?) Die Fehlermeldungen sind in 4 Stufen geteilt: major minor critical und fatal. Unter diese Fehlerstufen gibt noch viele Fehlermeldungen. Das Problem ist, ich weiß nicht, welche Fehler aufgetretten sind. Deshalb habe ich erstmal nach Fehlerstufe gesucht ( das Ergebnis wie oben - bis dieser Stelle kann ich nicht weiterkommen). Diese Fehlermeldungen sollen jetzt feiner sortieren ( nicht nach Fehlerstufe sondern nach bestimmte Fehlermeldungen). Und mit nur 3 Tage mit Linux zu arbeiten kann ich das nicht machen und kenne ich auch nicht , ob es in Linux ein Befehl dieses Problem zu lösen. Vielleicht du hast gedacht, dass ich nur den Script brauche aber so ist das nicht.

Vielleicht ist hier jemand Zeit und Lust hat, mich zu erklären/zeigen, wie ich das machen kann.
Sorry für mein Deutsch aber ich hoffe, das ihr verstehen kann.

Danke & Gruß
Mitglied: 64748
64748 Apr 25, 2009 at 06:55:24 (UTC)
Goto Top
Guten Morgen ericdat,

also ich empfehle Dir erstmal zu verstehen, was die Fehlermeldungen überhaupt bedeuten. Da kann Google ganz hilfreich sein.
Allein durch sortieren der Fehlermeldungen wirst Du Dein Problem nicht lösen können.

Gruß

Markus
Mitglied: 77559
77559 Apr 25, 2009 at 08:39:52 (UTC)
Goto Top
Hallo ericdat,

für das Analysieren von Logfiles gibt es Tools, Such mal mit deiner Suchmaschine nach Syslog analysis. (Auch wenn deinen Zeilen ein Zeitstempel fehlt)

Gruß
LotPings
Mitglied: 76109
76109 Apr 25, 2009 at 11:05:27 (UTC)
Goto Top
Hallo ericdat,

anhand Deiner Vorgaben, habe ich mal folgendes VB-Script zusammengebastelt.
Die Pfadangaben müssen natürlich entsprechend angepasst werden.

Option Explicit

Const iPath = "F:\Test\Import.Csv"  
Const ePath = "F:\Test\Export.Txt"  

Const adVarChar = 200
Const adFldIsNullable = 32

Dim Fso, iFile, eFile, i, ix, DataRec, Text, TextMsg, CaseMsg, TextCnt, CaseCnt, SumCnt


'Main Beg  


    Set Fso = CreateObject("Scripting.FileSystemObject")  

    Set iFile = Fso.OpenTextFile(iPath)

    Call OpenRecordset
    
    Do Until iFile.AtEndOfStream
        ix = Split(iFile.ReadLine)
        If UBound(ix) = 5 Then Call WriteRecordset
    Loop
    
    iFile.Close
    
    Set eFile = Fso.CreateTextFile(ePath)
    
    With DataRec
       .Sort = "Sp1, Sp3, Sp4"  
       .MoveFirst
        TextMsg = "":  CaseMsg = "":  TextCnt = 0  
        Do Until DataRec.EOF
            For i = 0 To 5:  ix(i) = .Fields(i):  Next
            Text = ix(0) & " " & ix(1) & " " & ix(2) & " " & ix(3) & " " & ix(4)  
            If TextMsg <> Text Then
                If CaseMsg <> "" Then eFile.WriteLine vbTab & CaseMsg & vbTab & " x " & CaseCnt  
                If TextMsg <> "" Then eFile.WriteLine vbCrLf & vbTab & "Anzahl: " & SumCnt & vbCrLf  
                TextMsg = Text:  CaseMsg = ix(5):  TextCnt = TextCnt + 1:  CaseCnt = 1:  SumCnt = 1
                eFile.WriteLine TextCnt & ". " & TextMsg  
            ElseIf CaseMsg <> ix(5) Then
                eFile.WriteLine vbTab & CaseMsg & vbTab & " x " & CaseCnt  
                CaseMsg = ix(5):  CaseCnt = 1:  SumCnt = SumCnt + 1
            Else
                CaseCnt = CaseCnt + 1:  SumCnt = SumCnt + 1
            End If
           .MoveNext
        Loop
        If CaseMsg <> "" Then  
            eFile.WriteLine vbTab & CaseMsg & vbTab & " x " & CaseCnt  
            eFile.WriteLine vbCrLf & vbTab & "Anzahl: " & SumCnt & vbCrLf  
        End If
    End With
    
    eFile.Close:  DataRec.Close
    
    WScript.Quit

'Main End  


Private Sub OpenRecordset()
    Set DataRec = CreateObject("ADOR.Recordset")  
    With DataRec.Fields
        .Append "Sp1", adVarChar, 32, adFldIsNullable  
        .Append "Sp2", adVarChar, 32, adFldIsNullable  
        .Append "Sp3", adVarChar, 32, adFldIsNullable  
        .Append "Sp4", adVarChar, 64, adFldIsNullable  
        .Append "Sp5", adVarChar, 32, adFldIsNullable  
        .Append "Sp6", adVarChar, 32, adFldIsNullable  
         DataRec.Open
    End With
End Sub


Private Sub WriteRecordset()
    With DataRec
        .AddNew
         For i = 0 To 5:  .Fields(i) = ix(i):  Next
        .Update
    End With
End Sub


Das Ergebnis in Export.Txt:

1. critical TDMA (1.06388) HdlKeepAliveMsg: RxTask
	Case100/IDU16	 x 4

	Anzahl: 4

2. critical TDMA (1.07415) Fallback timeout:
	Case100/IDU11	 x 1
	Case100/IDU13	 x 1
	Case100/IDU14	 x 1
	Case101/IDU11	 x 1
	Case101/IDU12	 x 1
	Case101/IDU13	 x 1
	Case101/IDU14	 x 1
	Case101/IDU15	 x 1

	Anzahl: 8

3. critical TDMA (1.08396) FpgaRxErrInt: rtcTck
	Case101/IDU16	 x 5

	Anzahl: 5

4. major TDMA (1.04893) Wrong rxTm
	Case114/IDU16	 x 1

	Anzahl: 1

5. major TDMA (1.08772) WaitExecRxHopBdetEna: timeout
	Case100/IDU16	 x 2
	Case114/IDU11	 x 8
	Case139/IDU14	 x 4
	Case4/IDU15	 x 2
	Case55/IDU13	 x 1
	Case87/IDU16	 x 4

	Anzahl: 21

6. minor TDMA (1.00942) ComputeRTT: RTT
	Case101/IDU11	 x 2
	Case101/IDU12	 x 2
	Case101/IDU15	 x 1
	Case110/IDU13	 x 1
	Case110/IDU14	 x 1

	Anzahl: 7

7. minor TDMA (1.01123) ExtrapolateRtt: extrapol
	Case110/IDU16	 x 3

	Anzahl: 3

8. minor TDMA (1.01916) txActPlanGener: txTimeQueue
	Case136/IDU12	 x 3

	Anzahl: 3

9. minor TDMA (1.04152) Following suppressed
	Case106/IDU11	 x 1
	Case106/IDU15	 x 1

	Anzahl: 2

10. minor TDMA (1.04152) TransmTask: SatMux
	Case106/IDU11	 x 1
	Case106/IDU15	 x 1

	Anzahl: 2

11. minor TDMA (1.07290) ServerTask: periodic
	Case17/IDU16	 x 1
	Case18/IDU13	 x 1
	Case3/IDU15	 x 1
	Case32/IDU16	 x 1
	Case61/IDU14	 x 1

	Anzahl: 5

Probiers mal aus.

Gruß Dieter
Member: ericdat
ericdat Apr 27, 2009 at 07:35:14 (UTC)
Goto Top
Vielen Dank für eure Antwort!

@76109: ich kann VB-Script nicht *_* aber werde mal probieren. Danke dir ^^
Mitglied: 76109
76109 Apr 27, 2009 at 08:08:45 (UTC)
Goto Top
Hallo ericdat,

jetzt teste erstmal mit verschieden Import.Csv, indem Du den Pfad in den Zeilen 3 und 4 entsprechend definierst und das Script startest.

Im Anschluss kann man es so gestalten, dass Du das Script per Batch mit Argumenten aufrufst. Oder eine InputBox einfügt, die Argumente
abfrägt. Und/oder eine Verknüpfung im Kontext-Menu mit <Senden an><Script> erstellt.

Du kannst auch gerne Fragen stellen

Gruß Dieter
Member: ericdat
ericdat Apr 27, 2009 at 14:21:49 (UTC)
Goto Top
Hallo Dieter,

erstmal ein dickes Dank an dir. Dein Ergebnis sieht super aus, genau so wollte ich haben. Aber ich kenne Visual basic nicht deshalb verstehe ich dein Code auch nicht face-smile. Ich schreibe gerade eine Shell-Datei unter Linux und bis dieser Stelle kann nicht nicht mehr weiterkommen. awk ist vielleicht eine gute Antwort ???

gruß
Mitglied: 76109
76109 Apr 27, 2009 at 22:27:52 (UTC)
Goto Top
hallo ericdat,

also mit awk, Linux etc. kann ich Dir leider nicht weiterhelfen. Da ich nicht im IT-Bereich tätig bin, beschäftige ich mich auch nicht mit mit
diesen Dingen. Vielleicht kann Dir ja jemand anders den VB-Code in ein anders Format übersetzen. Am besten Du verfasst diesbezüglich
einen neuen Beitrag.

Gruß Dieter
Member: ericdat
ericdat Apr 28, 2009 at 15:46:45 (UTC)
Goto Top
Hey Dieter,

ich danke dir trotzdem ... für deine mühe das du mir helfen wolltest.

Gruß
Mitglied: 76109
76109 Apr 28, 2009 at 22:15:05 (UTC)
Goto Top
Hallo ericdat,

gern geschehenface-smile

Falls Du aber noch Erklärungen zu den einzelnen Funktionen im VB-Script benötigst, dann melde Dich einfach.


Gruß Dieter