myGully.com Boerse.SH - BOERSE.AM - BOERSE.IO - BOERSE.IM Boerse.BZ .TO Nachfolger
Ungelesen 03.12.18, 16:02   #1
Kaiser11
Newbie
 
Benutzerbild von Kaiser11
 
Registriert seit: Oct 2009
Beiträge: 98
Bedankt: 3
Kaiser11 ist noch neu hier! | 0 Respekt Punkte
Standard Textdokument per Batch auswerten

Hallo,
ich hoffe ihr könnt mir beim erstellen einer Batch Datei behilflich sein.
Ich habe in einem Verzeichnis sehr viele Logfiles in denen immer wieder „Datum Errorxx“ Einträge vorhanden sind.
Um diese zu filter habe ich den find Befehl benutzt. Anschließend werden alle Error Zeilen mit dem >> Befehl in ein neues File geschrieben.
Dies sieht dann in etwa folgermaßen aus:
01.01.2018_12:34 Error12
01.01.2018_13:45 Error03
01.01.2018_14:34 Error12
01.01.2018_16:45 Error08

Ich möchte jetzt eine zusätzliche Batch erstellen, welche die jeweiligen Zeilen auswertet
Dies sollte folgermaßen aussehen:
01.01.2018_12:34 Error12
Motor1
01.01.2018_13:45 Error03
Motor2
01.01.2018_14:34 Error12
Motor1
01.01.2018_16:45 Error08
Motor3

Soweit es dies verstanden habe kann ich wieder mit dem find Befehl arbeiten.
Aber dann weiß ich leider nicht mehr weiter.
Ich hoffe ihr könnt mich ein bischen unterstützen bzw. ein paar Ratschläge geben.

Schönen Abend
Kaiser11 ist offline   Mit Zitat antworten
Ungelesen 05.12.18, 10:27   #2
0x331
Newbie
 
Registriert seit: Nov 2012
Beiträge: 65
Bedankt: 21
0x331 ist noch neu hier! | 0 Respekt Punkte
Standard

Bevor dir hier keiner antwortet
Das gesamts***** sollte so aussehen?:

-->ERRORXXlogs aus verschiedenen Dateien in Verzeichnis in eine neue log Datei schreiben.

01.01.2018_12:34 Error12
01.01.2018_13:45 Error03
01.01.2018_14:34 Error12
01.01.2018_16:45 Error08

-->im nächsten Schritt soll die neue Log Datei ausgewertet werden. Hier wird von jeder Zeile der Error ausgewertet so ist z.B. (Error12 => Motor1). Und das soll dann in eine neue Zeile/ dahinter etc. geschrieben werden.

01.01.2018_12:34 Error12
Motor1
01.01.2018_13:45 Error03
Motor2
01.01.2018_14:34 Error12
Motor1
01.01.2018_16:45 Error08
Motor3

Wo ist die Fehlerübersicht? Wie viele Fehler gibt es? Bzw. du könntest das auch ohne zwischen Log-File auswerten.

Mein Ratschlag: geh weg von Batch und mach das kleine S***** mit python
0x331 ist offline   Mit Zitat antworten
Ungelesen 05.12.18, 15:01   #3
eitch100
Agnostiker
 
Benutzerbild von eitch100
 
Registriert seit: Dec 2009
Beiträge: 4.201
Bedankt: 4.429
eitch100 leckt gerne myGully Deckel in der Kanalisation! | 1104671402 Respekt Punkteeitch100 leckt gerne myGully Deckel in der Kanalisation! | 1104671402 Respekt Punkteeitch100 leckt gerne myGully Deckel in der Kanalisation! | 1104671402 Respekt Punkteeitch100 leckt gerne myGully Deckel in der Kanalisation! | 1104671402 Respekt Punkteeitch100 leckt gerne myGully Deckel in der Kanalisation! | 1104671402 Respekt Punkteeitch100 leckt gerne myGully Deckel in der Kanalisation! | 1104671402 Respekt Punkteeitch100 leckt gerne myGully Deckel in der Kanalisation! | 1104671402 Respekt Punkteeitch100 leckt gerne myGully Deckel in der Kanalisation! | 1104671402 Respekt Punkteeitch100 leckt gerne myGully Deckel in der Kanalisation! | 1104671402 Respekt Punkteeitch100 leckt gerne myGully Deckel in der Kanalisation! | 1104671402 Respekt Punkteeitch100 leckt gerne myGully Deckel in der Kanalisation! | 1104671402 Respekt Punkte
Standard

Zum Ersten solltest du da mal in der "Programmierabteilung" nachfragen...
[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]

Zum Zweiten solltest du mal deinen Code posten, da kann man bestimmt gleich die Auswertung mit einfügen. Wenn es nicht zu viele Möglichkeiten sind bzw. nur 3 ist das mit einer einfachen oder mehrfachen "if (else)-Anweisung" bestimmt möglich. Das geht natürlich auch mit vielen Möglichkeiten; aber naja... das wird irgendwann unübersichtlich.

Zum Dritten würde ich es mit Excel machen. Ich könnte es heute nicht mehr, aber die Auswertung wird später sicher übersichtlicher und kann beliebig erweitert werden... könntest mal in "Herbers Excel Forum" fragen... hier mal ein ungefähres Beispiel:
[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]
__________________
Der Klügere gibt nach... deshalb regieren die Dummen die Welt

Geändert von eitch100 (05.12.18 um 15:11 Uhr)
eitch100 ist offline   Mit Zitat antworten
Folgendes Mitglied bedankte sich bei eitch100:
Osiris1983 (05.12.18)
Ungelesen 05.12.18, 17:04   #4
Osiris1983
Chuck Norris
 
Benutzerbild von Osiris1983
 
Registriert seit: Jun 2010
Ort: /users/osiris
Beiträge: 3.703
Bedankt: 4.281
Osiris1983 leckt gerne myGully Deckel in der Kanalisation! | 1139965 Respekt PunkteOsiris1983 leckt gerne myGully Deckel in der Kanalisation! | 1139965 Respekt PunkteOsiris1983 leckt gerne myGully Deckel in der Kanalisation! | 1139965 Respekt PunkteOsiris1983 leckt gerne myGully Deckel in der Kanalisation! | 1139965 Respekt PunkteOsiris1983 leckt gerne myGully Deckel in der Kanalisation! | 1139965 Respekt PunkteOsiris1983 leckt gerne myGully Deckel in der Kanalisation! | 1139965 Respekt PunkteOsiris1983 leckt gerne myGully Deckel in der Kanalisation! | 1139965 Respekt PunkteOsiris1983 leckt gerne myGully Deckel in der Kanalisation! | 1139965 Respekt PunkteOsiris1983 leckt gerne myGully Deckel in der Kanalisation! | 1139965 Respekt PunkteOsiris1983 leckt gerne myGully Deckel in der Kanalisation! | 1139965 Respekt PunkteOsiris1983 leckt gerne myGully Deckel in der Kanalisation! | 1139965 Respekt Punkte
Standard

Zitat:
Zitat von eitch100 Beitrag anzeigen
Zum Ersten solltest du da mal in der "Programmierabteilung" nachfragen...
Definitiv, aber bitte dann bevor ein Thema in dem falschen Bereich erstellt wird. Wenn das Thema schon in dem falschen Bereich erstellt wurde, dann bittet einen zuständigen Mod (also in dem Fall mich) oder falls in dem Bereich kein Mod eingetragen ist, einen blauen Mod, das Thema zu verschieben

Thema verschoben
__________________


Bitte keine Supportanfragen per PN! Dafür ist das Forum doch da.

[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]|[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]|[ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ][ Link nur für registrierte Mitglieder sichtbar. Bitte einloggen oder neu registrieren ]

Osiris1983 ist offline   Mit Zitat antworten
Ungelesen 06.12.18, 23:38   #5
Kaiser11
Newbie
 
Benutzerbild von Kaiser11
 
Registriert seit: Oct 2009
Beiträge: 98
Bedankt: 3
Kaiser11 ist noch neu hier! | 0 Respekt Punkte
Standard

Danke für die Antworten.

@0x331
Es gibt ca. 30 Fehler.
Ich habe die Fehlerübersicht aktuell einfach nur in einem Textdokument.
Ich habe im Internet folgenden Code gefunden.

@echo off &setlocal
set "search=%"
set "replace=%2"
set "textfile=Input.txt"
set "newfile=Output.txt"
(for /f "delims=" %%i in (%textfile%) do (
set "line=%%i"
setlocal enabledelayedexpansion
set "line=!line:%search%=%replace%!"
echo(!line!
endlocal
))>"%newfile%"
del %textfile%
rename %newfile% %textfile%

Dies war mein erster Ansatz welchen ich leider nicht komplett funktionsfähig hingebracht habe.
Bei diesem Code müsste ich dann für jeden Fehler den Code anpassen und in der Batch ergänzen was natürlich extrem
umständlich ist.

@eitch100
Ich hab mir gedacht ein Batch Programm ist für die "Programmierabteilung"
ein bischen unterdimensioniert
Ich habe z.B. 40 Logfiles auf meinem PC
In meiner aktuellen Batch Datei führe ich eigentlich nur folgende Zeile aus.

find "error" C:\Logfiles\*.log >> C:\Logfiles\Errorergebnis.txt
Dadurch bekomme ich ein .txt File in dem alle Zeilen welche einen Error Eintrag enthalten zusammenfasst.

Mein neuer Ansatz:
Zu beginn der Batch Datei definiere ich die Fehlerliste
set 1.0=Error03
set 1.1=Motor2
set 2.0=Error12
set 2.1=Motor1

x.0 Steht für den Error Code welcher in den Logfiles ist.
x.1 Steht für den Text der anstatt des Error Code angezeigt werden soll


Das Filtern der Error Einträge bleibt gleich:
find "error" C:\Logfiles\*.log >> C:\Logfiles\Errorergebnis.txt

Jetzt weis ich aber nicht mehr weiter. Ich brauche eine Schleife welche
nacheinander das Errorergebnis.txt File nach 1.0, 2.0,... durchsucht und
falls z.B. 1.0 gefunden wird eine Zeile mit 1.1 ergänzt.

Zum Schluss würde das Errorergebnis.txt folgendermaßen ausschauen:
01.01.2018_14:34 Error12
Motor1
01.01.2018_16:45 Error08
Motor3

Könntet ihr mir da noch ein paar Tipps geben um dies zu realisieren.

Wie ihr schon geschrieben habt könnte dieser Ablauf natürlich mit anderen
Programmen z.B. Excel oder Phyton einfacher realisiert werden. Mein Problem ist jedoch ich möchte unabhängig auf jeden beliebigen Rechner diese Batch starten können und deshalb würde ich gerne bei Batch bleiben.

Schönen Abend.
Kaiser11 ist offline   Mit Zitat antworten
Ungelesen 07.12.18, 05:42   #6
Erik/Schreier
Ist öfter hier
 
Registriert seit: Feb 2011
Ort: Eastgermany
Beiträge: 222
Bedankt: 358
Erik/Schreier erschlägt nachts Börsenmakler | 26395 Respekt PunkteErik/Schreier erschlägt nachts Börsenmakler | 26395 Respekt PunkteErik/Schreier erschlägt nachts Börsenmakler | 26395 Respekt PunkteErik/Schreier erschlägt nachts Börsenmakler | 26395 Respekt PunkteErik/Schreier erschlägt nachts Börsenmakler | 26395 Respekt PunkteErik/Schreier erschlägt nachts Börsenmakler | 26395 Respekt PunkteErik/Schreier erschlägt nachts Börsenmakler | 26395 Respekt PunkteErik/Schreier erschlägt nachts Börsenmakler | 26395 Respekt PunkteErik/Schreier erschlägt nachts Börsenmakler | 26395 Respekt PunkteErik/Schreier erschlägt nachts Börsenmakler | 26395 Respekt PunkteErik/Schreier erschlägt nachts Börsenmakler | 26395 Respekt Punkte
Standard

Zitat:
Zitat von Kaiser11 Beitrag anzeigen
Dies war mein erster Ansatz welchen ich leider nicht komplett funktionsfähig hingebracht habe. Bei diesem Code müsste ich dann für jeden Fehler den Code anpassen und in der Batch ergänzen was natürlich extrem umständlich ist.
Haben sich vermutlich auch andere gedacht und daraufhin Ende der 50er Jahre Funktionale Programmierparadigmen entwickelt.

Zitat:
Zitat von Kaiser11 Beitrag anzeigen
find "error" C:\Logfiles\*.log >> C:\Logfiles\Errorergebnis.txt
Dadurch bekomme ich ein .txt File in dem alle Zeilen welche einen Error Eintrag enthalten zusammenfasst.
Da ich nicht glaube dass sich die Funktion des >> Operators gross von anderen Sprachen unterscheidet sieht es eher so aus als würdest du die Fehlerliste bei jedem Aufruf and die alte Fehlerliste anhängen.

Da du auf diese weise ohnehin jedesmal die Ausgangsliste löschen und neu erstellen musst kannst du die Liste auch gleich in der Shell ausgeben.

Zitat:
Zitat von Kaiser11 Beitrag anzeigen
Zu beginn der Batch Datei definiere ich die Fehlerliste
set 1.0=Error03
set 1.1=Motor2
set 2.0=Error12
set 2.1=Motor1

x.0 Steht für den Error Code welcher in den Logfiles ist.
x.1 Steht für den Text der anstatt des Error Code angezeigt werden soll
Tu dir selbst nen Gefallen und verwende eine Sprache die Dictionaries unterstützt, das da tut schon beim zusehen weh.

Zitat:
Zitat von Kaiser11 Beitrag anzeigen
Wie ihr schon geschrieben habt könnte dieser Ablauf natürlich mit anderen
Programmen z.B. Excel oder Phyton einfacher realisiert werden. Mein Problem ist jedoch ich möchte unabhängig auf jeden beliebigen Rechner diese Batch starten können
Und exakt aus diesem Grund solltest du Python verwenden!

Herr Gott. Warum du aus ner Fehlerliste eine Liste mit speziellen Fehlern erstellen willst und aus dieser dann noch eine mit der Übersetzung der Fehler leuchtet mir nicht ein.

Schreib ein Python s***** das die Logdatei Zeile für Zeile einliest, verwende slicing um den Fehlercode zu isolieren, immerhin scheinen die Zeilen immer 23 Zeichen lang zu sein wobei der Fehlercode immer ln[-7] - ln[-1] ist, ersetzt mithilfe eines Dictionaries den Fehlercode direkt durch den Motor der den Fehler geschossen hat und gib die Zeile zum Schluss in der Shell aus, mit nem Alias braucht son s***** nichtmal ne Sekunde zur Ausführung.
__________________
1. Streite niemals mit Idioten, sie ziehen dich auf ihr Niveau und schlagen dich dann mit Erfahrung.

2. Wenn jemand denkt er hat die Oberhand, brich sie ihm.
Erik/Schreier ist offline   Mit Zitat antworten
Die folgenden 2 Mitglieder haben sich bei Erik/Schreier bedankt:
0x331 (08.12.18), Osiris1983 (07.12.18)
Ungelesen 07.12.18, 19:32   #7
Wornat1959
Profi
 
Registriert seit: Aug 2016
Beiträge: 1.859
Bedankt: 6.235
Wornat1959 leckt gerne myGully Deckel in der Kanalisation! | 2119272 Respekt PunkteWornat1959 leckt gerne myGully Deckel in der Kanalisation! | 2119272 Respekt PunkteWornat1959 leckt gerne myGully Deckel in der Kanalisation! | 2119272 Respekt PunkteWornat1959 leckt gerne myGully Deckel in der Kanalisation! | 2119272 Respekt PunkteWornat1959 leckt gerne myGully Deckel in der Kanalisation! | 2119272 Respekt PunkteWornat1959 leckt gerne myGully Deckel in der Kanalisation! | 2119272 Respekt PunkteWornat1959 leckt gerne myGully Deckel in der Kanalisation! | 2119272 Respekt PunkteWornat1959 leckt gerne myGully Deckel in der Kanalisation! | 2119272 Respekt PunkteWornat1959 leckt gerne myGully Deckel in der Kanalisation! | 2119272 Respekt PunkteWornat1959 leckt gerne myGully Deckel in der Kanalisation! | 2119272 Respekt PunkteWornat1959 leckt gerne myGully Deckel in der Kanalisation! | 2119272 Respekt Punkte
Standard

@Kaiser11:
Das hier ist ja schon eine Art "Replace" wenn ich die Semantik richtig erfasse:
Code:
@echo off &setlocal
set "search=%"
set "replace=%2"
set "textfile=Input.txt"
set "newfile=Output.txt"
(for /f "delims=" %%i in (%textfile%) do (
set "line=%%i"
setlocal enabledelayedexpansion
set "line=!line:%search%=%replace%!"
echo(!line!
endlocal
))>"%newfile%"
del %textfile%
rename %newfile% %textfile%
Dir fehlt auf der S*****-Ebene nur das er das Ergebnis aus dem find für jeden Key/Value ausführt. Könnte man auch auf der S*****-Ebene lösen. Aber mir ist die Windows-Shell-Syntax zu krude. Auf der Linuxebene mit nem Shellskript gerne. Aber dann brauchste eine "bash" unter Windows.

Weil dir plattformunabhängigkeit wichtig war kannste aber auch Java nehmen. Das nötige JRE kannste für nahezu jede Plattform bekommen.

Und dann vielleicht so:
Code:
import java.io.File;
import java.io.FilenameFilter;
import java.io.FileNotFoundException;
import java.util.Iterator;
import java.util.Scanner;
import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Errorlogger
{
    public static final String LOG_VERZEICHNIS = "C:\Logfiles";
    public static final String LOG_SUFFIX = ".log";
    
    public static final HashMap replaceMap = new HashMap <String, String> ()
                                {{ put("Error03", "Motor2"); 
                                   put("Error12", "Motor1"); 
                                   put("Error08", "Motor3"); 
                                }};
    
    private static File logDirectory;
    private static File[] logFiles;
    
    public static void main(String[] args)
    {
        logDirectory = new File(LOG_VERZEICHNIS);
        logFiles = logDirectory.listFiles(new FilenameFilter()
        {
            @Override
            public boolean accept(File dir, String name)
            {
                return name.toLowerCase().endsWith(LOG_SUFFIX);
            }
        });
        
        Iterator<String> keyIterator;
        String laufSearch;
        String laufReplace;
        String laufLine;
        Scanner scanner;

        for (int lauf=0; lauf<logFiles.length; lauf++)
        {
            keyIterator = replaceMap.keySet().iterator();
            while (keyIterator.hasNext())
            {
                laufSearch = keyIterator.next();
                laufReplace = (String) replaceMap.get(laufSearch);
                
                try
                {
                    scanner = new Scanner(logFiles[lauf]);
                }
                catch (FileNotFoundException ex)
                {
                    ex.printStackTrace();
                }

                while (scanner.hasNextLine()) 
                {
                    laufLine = scanner.nextLine();
                    
                    Pattern pat = Pattern.compile(laufSearch);
                    Matcher match = pat.matcher( laufLine );
                    if (match.find()) 
                    {
                        System.out.println(laufLine.replace(laufSearch, laufReplace));
                    }
                }
            }
        }
    }
}
Dann kommt die Ausgabe auf den Bildschirm (stdout). Du kannst das aber dann genauso wie beim find mit dem ">>"-Operator in eine Datei umleiten.
Man könnte das auch per java noch wieder in eine Datei schreiben - hatte ich aber keine Lust mehr drauf ...

Es wird übrigens wirklich ersetzt und nicht eine neue Zeile eingebaut. Weil das war das was das Code-Schnippsel das du oben hattest auch macht wenn ich die Semantik richtig verstanden hatte. Also du bekommst dann so eine Ausgabe:
Code:
run:
01.01.2018_16:45 Motor3
01.01.2018_14:34 Motor1
Achja und du definierst die Zuordnung der Error->Motor Beziehungen oben in der replaceMap. Genauso stellste da das Verzeichnis wo die Logdateien liegen ein und kannst auch noch deren Dateisuffix einstellen. Das liesse sich auch noch weiter in den Aufruf des Programs auslagern als Parameter. Aber das Programm ist nur ein erster Ansatz für eine Java-Lösung und lässt sich sicher weiter verbessern.
__________________
"Mitleid und Erbarmen hielten Bilbos Hand zurück. Viele, die leben, verdienen den Tod und manche, die sterben, verdienen das Leben. Kannst du es ihnen geben, Frodo? Dann sei nicht so rasch mit einem Todesurteil bei der Hand. Selbst die ganz Weisen erkennen nicht alle Absichten. Mein Herz sagt mir, dass Gollum noch eine Rolle zu spielen hat, zum Guten oder zum Bösen, ehe das Ende kommt." (Gandalf zu Frodo)

Geändert von Wornat1959 (07.12.18 um 19:39 Uhr)
Wornat1959 ist offline   Mit Zitat antworten
Folgendes Mitglied bedankte sich bei Wornat1959:
0x331 (08.12.18)
Ungelesen 10.12.18, 22:39   #8
Erik/Schreier
Ist öfter hier
 
Registriert seit: Feb 2011
Ort: Eastgermany
Beiträge: 222
Bedankt: 358
Erik/Schreier erschlägt nachts Börsenmakler | 26395 Respekt PunkteErik/Schreier erschlägt nachts Börsenmakler | 26395 Respekt PunkteErik/Schreier erschlägt nachts Börsenmakler | 26395 Respekt PunkteErik/Schreier erschlägt nachts Börsenmakler | 26395 Respekt PunkteErik/Schreier erschlägt nachts Börsenmakler | 26395 Respekt PunkteErik/Schreier erschlägt nachts Börsenmakler | 26395 Respekt PunkteErik/Schreier erschlägt nachts Börsenmakler | 26395 Respekt PunkteErik/Schreier erschlägt nachts Börsenmakler | 26395 Respekt PunkteErik/Schreier erschlägt nachts Börsenmakler | 26395 Respekt PunkteErik/Schreier erschlägt nachts Börsenmakler | 26395 Respekt PunkteErik/Schreier erschlägt nachts Börsenmakler | 26395 Respekt Punkte
Standard



Jetzt weiss ich wieder warum ich kein Java nutze, in Ruby erklärt sich der Code fast von selbst.

Sorry für die lange Dauer bis zur Antwort, hab im Mom nur wenig Zeit.



Hier die PeP konforme Python Version, die erste war durch das über tragen des anderen Codes Mist.
__________________
1. Streite niemals mit Idioten, sie ziehen dich auf ihr Niveau und schlagen dich dann mit Erfahrung.

2. Wenn jemand denkt er hat die Oberhand, brich sie ihm.

Geändert von Erik/Schreier (15.12.18 um 15:01 Uhr)
Erik/Schreier ist offline   Mit Zitat antworten
Antwort

Themen-Optionen
Ansicht

Forumregeln
Du kannst keine neue Themen eröffnen
Du kannst keine Antworten verfassen
Du kannst keine Anhänge posten
Du kannst nicht deine Beiträge editieren

BB code is An
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist Aus.

Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:47 Uhr.


Sitemap

().