Jump to content

Mit find.exe mehrere Strings suchen


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Hallo,

 

ist es mgl., mit find.exe (findstr ist leider nicht mgl., da das Zeichenformat in den txt-Dateien Unicode ist) in einer Datei nach mehreren Strings zu suchen und den Inhalt der enthaltenden Dateien komplett in eine Datei zu exportieren? Konkret geht es um die Log-Dateien, die von Backup Exec erzeugt werden.

Eine Log-Datei hat bspw. diesen Aufbau:

Servername : SERVER-BACKUP1

Auftragsname : Laufwerk inventarisieren

Auftragsprotokoll: C:\Program Files\Symantec\Backup Exec\Data\BEX_SERVER-BACKUP1_01443.xml

Gerätename : QUANTUM 1

 

 

Schacht Strichcode Medienkennung StatusGerät

------------------------------------------------------------------------------------------------

Montag QUANTUM 1

 

Auftrag gestartet: Montag, 12. November 2012 14:00:01

Auftrag beendet : Montag, 12. November 2012 14:00:23

Abschlussstatus : Erfolgreich

Mein Anliegen ist eigentlich simpel: Wird in allen Log-Dateien, die im Verzeichnis "Data" unterhalb des Installationspfades liegen, das aktuelle Datum (das geht mit der Variable "%date%") sowie der String "Laufwerk inventarisieren" gefunden, so soll deren kompletter Inhalt in eine Datei geschrieben werden, die ich dann mittels Script als E-Mail verschicke.

Find.exe kann aber nur nach 1 String suchen, man müsste also die Suche verknüpfen, sodass nach "%date%" und "Laufwerk inventarisieren" gesucht wird. Außerdem müsste man find.exe anweisen, bei positivem Treffer den kompletten Inhalt einer Datei auszulesen, nicht nur die Trefferzeile.

Geht das so überhaupt oder bin ich mit meiner Idee total auf dem Holzweg? Falls letztes zutrifft, wie kann ich mein Anliegen trotzdem realisieren?

Danke vorab.

Link zu diesem Kommentar

Hi,

 

warum möchtest Du die Datei einlesen - hat BackupExec kein Ereignisprotokoll bzw. nutzt es nicht die Windows Ereignisprotokolle?

 

Ansonsten würde ich auch vorschlagen, die PowerShell zu nutzen.

Mittels Get-Content, Select-String und Konsorten läßt sich Dein Vorhaben sicher recht einfach und schnell lösen.

 

Sofern die Logdateien im XML-Format vorliegen, kannst Du diese mit der PowerShell noch einfacher einlesen.

 

Viele Grüße

olc

Link zu diesem Kommentar

Hallo

 

in der Erklärung von find wird die Einzahl Zeichenfolge verwendet. Bei Angabe von meheren Zeichenfolgen gibt es Fehlermeldungen z.B. Datei Zeichenfolge2 nicht gefunden. Auch werden nur mehrere Zeichenfolgen in einer Zeile gefunden, nicht in mehrerern.

 

Bei findstr wird in der Erklärung die Mehrzahl Zeichenfolgen verwendet.

 

Könnte man vor dem Verwenden von findstr die Codepage änderen?

bearbeitet von lefg
Link zu diesem Kommentar
Hi,

 

warum möchtest Du die Datei einlesen - hat BackupExec kein Ereignisprotokoll bzw. nutzt es nicht die Windows Ereignisprotokolle?

 

Ansonsten würde ich auch vorschlagen, die PowerShell zu nutzen.

Mittels Get-Content, Select-String und Konsorten läßt sich Dein Vorhaben sicher recht einfach und schnell lösen.

 

Sofern die Logdateien im XML-Format vorliegen, kannst Du diese mit der PowerShell noch einfacher einlesen.

 

Viele Grüße

olc

Danke für die erste konstruktive Bemerkung hier.

Ich habe wenig Erfahrung mit PS, gestern probierte ich noch mit select-string herum, bekam es aber nicht hin, bei einem Treffer den kompletten Inhalt einer Datei zu extrahieren und Dateien einzulesen, die das Datum des aktuellen Tages haben (egal, ob an dem Tag erstellt oder das Datum als String in der Datei). Stets wurden immer alle Dateien ausgelesen, die den entsprechenden String beinhalten. Mit get-date kann ich mir zwar das aktuelle Datum ausgeben lassen, aber wie suche ich nach einem String, der gleich dem aktuellen Datum ist, ohne dass ich dieses explizit angeben muss. Es müsste also nach einer Variable gesucht werden, was ich nicht hinbekomme.

Mit select-string könnte ich z.B. nach "Auftragsname : Laufwerk inventarisieren" in einer Datei suchen, die das aktuelle Datum beinhaltet oder das Änderungsdatum des aktuellen Tages aufweist und PS anweisen, bei beiden Übereinstimmungen den kompletten Inhalt der Datei auszugeben.

Link zu diesem Kommentar

Hi,

 

mittels "Select-String -Context X,Y" Parameter kannst Du, wenn Du weißt wie viele Zeilen bei einem Event vor und nach Deinem Suchstring angegeben sind, die Ausgabe um den Suchstring herum ausgeben.

 

Wenn Du weiter gehen möchtest, kannst Du auch mit Regular Expressions arbeiten, die PowerShell bietet dort eine Menge Möglichkeiten.

 

Noch einmal explizit nachgefragt: BackupExec bringt kein Eventlog mit?

 

Viele Grüße

olc

Link zu diesem Kommentar

Mit

select-string -path *.txt -pattern "Laufwerk inventarisieren" -context 1, 10 > inventarisieren-ausgabe.txt

erreiche ich, dass alle txt-Dateien mit dem übereinstimmmenden String aufgelistet werden. So weit, so gut. Wenn ich nun PS anweisen kann, alle Zeilen der Ausgabe, mit Ausnahme der letzten 7 Zeilen, zu löschen, bräuchte ich nicht nach Datum filtern, da die benötigten Infos immer ganz unten in den 7 letzten Zeilen stehen. Kann mir evtl. jemand sagen, wie ich das erreiche?

Danke vorab.

 

Das geht so:

$ausgabe = "d:\data\a-powershell-ausgabe.txt"
select-string -path *.txt -pattern "Laufwerk inventarisieren" -context 1, 10 > a-powershell-ausgabe.txt
(Get-Content $ausgabe | Select-Object -Last 7) | Set-Content $ausgabe

Link zu diesem Kommentar

Würde der gesamte Befehl dann etwa so ausschauen?

$ausgabe = "d:\data\a-powershell-ausgabe.txt"
select-string -path *.txt -pattern "Laufwerk inventarisieren" -context 1, 10 > a-powershell-ausgabe.txt
foreach ($item in $ausgabe)
{
    $text = "$($result.Context.PostContext[3].Substring(3))"
    $text
}
(Get-Content $ausgabe | Select-Object -Last 7) | Set-Content $ausgabe

Irgendwie klappt es so nicht. Die Ausgabe ist nun wieder genauso groß wie ohne die Filterung "Select-Object -Last 7". Was mache ich falsch?

 

Die Ausgabe kommt folgendermaßen formatiert an:

BEX_SERVER-BACKUP_01463.txt:2:Auftragsname : Laufwerk inventarisieren

BEX_SERVER-BACKUP_01463.txt:3:Auftragsprotokoll: C:\Program Files\Symantec\Backu

p Exec\Data\BEX_SERVER-BACKUP_01463.xml

BEX_SERVER-BACKUP_01463.txt:4:Gerätename : QUANTUM 1

BEX_SERVER-BACKUP_01463.txt:5:

BEX_SERVER-BACKUP_01463.txt:6:

BEX_SERVER-BACKUP_01463.txt:7:Schacht Strichcode

Medienkennung StatusGerät

BEX_SERVER-BACKUP_01463.txt:8:--------------------------------------------------

----------------------------------------------

BEX_SERVER-BACKUP_01463.txt:9:

Samstag 3 QUANTUM 1

BEX_SERVER-BACKUP_01463.txt:10:

BEX_SERVER-BACKUP_01463.txt:11:Auftrag gestartet: Samstag, 17. November 2012 14:

00:02

BEX_SERVER-BACKUP_01463.txt:12:Auftrag beendet : Samstag, 17. November 2012 14:

00:27

BEX_SERVER-BACKUP_01463.txt:13:Abschlussstatus : Erfolgreich

Es müssten die ersten 33 Characters jeder Zeile gekürzt werden. bearbeitet von ibicis
Link zu diesem Kommentar

Hi,

 

ich habe gerade keine Zeit mir das genauer anzuschauen - aber Du liest oben die Original-Datei wieder ein, anstatt Deinen ersten gefilterten Export zu nutzen.

 

Probiere es einmal in dieser Richtung:

$ausgabe = "d:\data\a-powershell-ausgabe.txt"
$filtered = select-string -path *.txt -pattern "Laufwerk inventarisieren" -context 1, 10 
$result = foreach ($item in $filtered)
{
    $text = "$($item.Context.PostContext[3].Substring(3))"
    $text
}
(Get-Content $result | Select-Object -Last 7) | Set-Content $ausgabe

 

Viele Grüße

olc

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...