Powershell - Zeilenumbruch hinter oder vor keyword in log Datei einfügen
Hallo zusammen,
ich verzweifele gerade an einem kleinen Skript:
Ich habe eine große Log-Datei (mit Datei und Verzeichnisangaben eines bestimmten Pfades aus einem LINUX System), ohne jegliche Zeilenumbrüche.
Jetzt würde ich gerne, dass alle Dateiuen bzw Pfade untereinander stehen.
Das heisst, ich würde gerne einen Zeilenumbruch hinter jeden Dateinamen bzw. vor jede Anzeige der Dateirechte (-rw-rw----) hinbekommen, finde allerdings keinen Ansatz hierfür.
Das Problem ist, dass alle Dateirechte unterscheidlich sind. ich kann also nicht nach z.B. "-rw-rw----" suchen. Auch heißen alle Dokumente anders, sodass ich auch hier nach keinem bestimmten Pattern suchen kann.
Das Einzige immer wiederkehrende sind die Lehrstellen in der Dateibeschreibung -rw-rw---- 1 root log .................
Hat dafür jemand einen Ansatz oder gar ein fertiges Skript
Danke und Gruß
Newbi
ich verzweifele gerade an einem kleinen Skript:
Ich habe eine große Log-Datei (mit Datei und Verzeichnisangaben eines bestimmten Pfades aus einem LINUX System), ohne jegliche Zeilenumbrüche.
Jetzt würde ich gerne, dass alle Dateiuen bzw Pfade untereinander stehen.
Das heisst, ich würde gerne einen Zeilenumbruch hinter jeden Dateinamen bzw. vor jede Anzeige der Dateirechte (-rw-rw----) hinbekommen, finde allerdings keinen Ansatz hierfür.
Das Problem ist, dass alle Dateirechte unterscheidlich sind. ich kann also nicht nach z.B. "-rw-rw----" suchen. Auch heißen alle Dokumente anders, sodass ich auch hier nach keinem bestimmten Pattern suchen kann.
Das Einzige immer wiederkehrende sind die Lehrstellen in der Dateibeschreibung -rw-rw---- 1 root log .................
Hat dafür jemand einen Ansatz oder gar ein fertiges Skript
Danke und Gruß
Newbi
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 666338
Url: https://administrator.de/forum/powershell-zeilenumbruch-hinter-oder-vor-keyword-in-log-datei-einfuegen-666338.html
Ausgedruckt am: 06.03.2025 um 22:03 Uhr
13 Kommentare
Neuester Kommentar
Wie entstehen denn die betreffenden Log-Dateien? Durch ein selbstgeschriebenes Script?
Das Phänomen, dass Verzeichnisangaben fortlaufend hintereinander in eine Datei geschrieben werden, ist dann zu beobachten, wenn innerhalb eines Scripts die Ausgabe des Befehls ls -la zunächst in eine Variable geschrieben wird und dann erst aus der Variable heraus die Daten in die Log-Datei gelangen. Geeignete Abhilfe dagegen ist, die Ausgabe direkt in die Log-Datei umzuleiten. Sind vorher weitere Bearbeitungsschritte erforderlich, dann kann eine Hilfsdatei gute Dienste leisten.
Viele Grüße
HansDampf06
Das Phänomen, dass Verzeichnisangaben fortlaufend hintereinander in eine Datei geschrieben werden, ist dann zu beobachten, wenn innerhalb eines Scripts die Ausgabe des Befehls ls -la zunächst in eine Variable geschrieben wird und dann erst aus der Variable heraus die Daten in die Log-Datei gelangen. Geeignete Abhilfe dagegen ist, die Ausgabe direkt in die Log-Datei umzuleiten. Sind vorher weitere Bearbeitungsschritte erforderlich, dann kann eine Hilfsdatei gute Dienste leisten.
Viele Grüße
HansDampf06
Moin,
Regex Tutorial
Regex Legende
Mit Powershell, z.B.:
Heisst übersetzt: Splitte überall, wo 10 aufeinander folgende Zeichen folgen, die aus -, d, r, w, s, S, t,l oder x bestehen und dahinter ein Leerzeichen folgt.
Gruß Thomas
Zitat von @newbi2009:
Ich habe eine große Log-Datei (mit Datei und Verzeichnisangaben eines bestimmten Pfades aus einem LINUX System), ohne jegliche Zeilenumbrüche.
Heisst im Klartext, du bist jetzt auf Windows unterwegs?!Ich habe eine große Log-Datei (mit Datei und Verzeichnisangaben eines bestimmten Pfades aus einem LINUX System), ohne jegliche Zeilenumbrüche.
Jetzt würde ich gerne, dass alle Dateiuen bzw Pfade untereinander stehen.
Das Problem ist, dass alle Dateirechte unterscheidlich sind. ich kann also nicht nach z.B. "-rw-rw----" suchen.
Doch kannst du, genau dafür gibt es RegEx:Das Problem ist, dass alle Dateirechte unterscheidlich sind. ich kann also nicht nach z.B. "-rw-rw----" suchen.
Regex Tutorial
Regex Legende
Mit Powershell, z.B.:
(Get-Content 'C:\Test\Datei.log') -Split '(?=[\-drwsxlSt]{10}\s)'
Gruß Thomas
Zitat von @TK1987:
Mit Powershell, z.B.:
Heisst übersetzt: Splitte überall, wo 10 aufeinander folgende Zeichen folgen, die aus -, d, r, w, s oder x bestehen.
Mit Powershell, z.B.:
(Get-Content 'C:\Test\Datei.log') -Split '(?=[\-drwsx]{10})'
Ich habe das jetzt nicht ausprobierte, aber wegen der Funktionsweise von Splittbefehlen im anderen Zusammenhang: Führt das aber nicht dazu, dass der Zeilenumbruch an die Stelle der (bisherigen) Suchzeichenfolge tritt?
Und dann bedarf es doch noch einer komplexeren Suchzeichenfolge. Wenn ich den Codeschnipsel richtig verstehe, wird nur ein einziges Zeichen untersucht. Indes müssen sieben Zeichen untersucht werden. Mit der Auswertung nur eines Zeichens würde an ganz vielen Stellen ein Splitting erfolgen.
Ferner fehlen noch die Zeichen S und t für spezielle Bits.
Viele Grüße
HansDampf06
Zitat von @HansDampf06:
Führt das aber nicht dazu, dass der Zeilenumbruch an die Stelle der (bisherigen) Suchzeichenfolge tritt?
Nein. ?= ist eine Lookahead-Assoziation - es wird nur geprüft, ob das dahinter steht - ohne es mit zu ersetzen.Führt das aber nicht dazu, dass der Zeilenumbruch an die Stelle der (bisherigen) Suchzeichenfolge tritt?
Wenn ich den Codeschnipsel richtig verstehe, wird nur ein einziges Zeichen untersucht.
Dann hast du das falsch verstanden. Es müssen, wie ich oben bereits beschrieben habe, exakt 10 Zeichen aus der Kombination aufeinander folgen.Ferner fehlen noch die Zeichen S und t für spezielle Bits.
Danke für den Hinweis, ist oben noch ergänzt.
Wenn der Suchstring nicht ersetzt wird und das Splitting VOR dem Suchstring erfolgt, dann dürfte es passen.
Mit Blick auf Hard- und Symbolic-Links kann an erster Stelle noch ein kleines L stehen. Das müsste dem Muster hinzugefügt werden.
Unabhängig davon sollte der TO den Ursprung der Log-Dateien prüfen, ob er dort bereits einen Fließtext ohne Umbrüche vermeiden kann. Dann bedarf es keiner späteren Nachbearbeitung des Inhalts der Log-Dateien, was regelmäßig den Aufwand und die Fehleranfälligkeit reduziert.
Viele Grüße
HansDampf06
Mit Blick auf Hard- und Symbolic-Links kann an erster Stelle noch ein kleines L stehen. Das müsste dem Muster hinzugefügt werden.
Unabhängig davon sollte der TO den Ursprung der Log-Dateien prüfen, ob er dort bereits einen Fließtext ohne Umbrüche vermeiden kann. Dann bedarf es keiner späteren Nachbearbeitung des Inhalts der Log-Dateien, was regelmäßig den Aufwand und die Fehleranfälligkeit reduziert.
Viele Grüße
HansDampf06
Zitat von @HansDampf06:
Wenn der Suchstring nicht ersetzt wird und das Splitting VOR dem Suchstring erfolgt, dann dürfte es passen.
Genau so.Wenn der Suchstring nicht ersetzt wird und das Splitting VOR dem Suchstring erfolgt, dann dürfte es passen.
Mit Blick auf Hard- und Symbolic-Links kann an erster Stelle noch ein kleines L stehen. Das müsste dem Muster hinzugefügt werden.
Erledigt. Zudem habe ich noch ergänzt, dass dahinter ein leerzeichen folgen muss.Selbiges funktioniert natürlich auch unter Linux mittels sed.
Da sed jedoch keine Lookahead/Lookbehind-Assoziationen unterstützt, muss die Suchzeichenfolge hier stattdessen in eine Gruppe gespeichert; und beim ersetzen mit ausgegeben werden.
cat ./test.log | sed -E 's/([-drwsxlSt]{10}\s)/\n\1/g'
Unabhängig davon sollte der TO den Ursprung der Log-Dateien prüfen, ob er dort bereits einen Fließtext ohne Umbrüche vermeiden kann. Dann bedarf es keiner späteren Nachbearbeitung des Inhalts der Log-Dateien, was regelmäßig den Aufwand und die Fehleranfälligkeit reduziert.
+1Gruß Thomas
Zitat von @newbi2009:
Wenn ich über plink abfrage (plink.exe -ssh <userID>@<Device> -pw xxxxxx ls -la mail_logs > <Pfad zur Datei> ) kommt das Ergebnis leider tatsächlich in diesem Format
Merkwürdig. Wie sieht es denn aus, wenn du den Befehl in die Pipeline jagst:Wenn ich über plink abfrage (plink.exe -ssh <userID>@<Device> -pw xxxxxx ls -la mail_logs > <Pfad zur Datei> ) kommt das Ergebnis leider tatsächlich in diesem Format
plink.exe -ssh <userID>@<Device> -pw xxxxxx 'ls -la mail_logs | sed -E s/$/###/g'
Btw: Falls du es noch nicht wusstest, Windows hat inzwischen einen eigenen SSH-Client, Putty ist also nicht mehr nötig. Zum Aktivieren, entweder in den Windows Einstellungen unter "Apps und Features > Optionale Features > Feature hinzufügen > OpenSSH-Client" aktivieren, oder
Powershell als Admin starten und folgenden Befehl ausführen:
Add-WindowsCapability -Online -Name 'OpenSSH.Client~~~~0.0.1.0'
Ich dachte du führst das unter Powershell aus?! Habe mich schon gewundert, dass du den Umleitungsoperator > statt Set-Content nutzt... aber funktioniert ja auch mit Umleitungsoperator unter Powershell 🤣
Ich würde dir aber raten, den plink gleich von Powershell aus auszuführen. Vielleicht hasst du das Problem da erst gar nicht... und falls doch, hast du mehr Möglichkeiten es zu untersuchen.
[...] gibt es leider kein "sed"
in CMD natürlich nicht, aber in dem Linux System. Wenn du das jedoch mit CMD machst, musst du Double-Quotes verwenden damit es funktioniert:plink.exe -ssh <userID>@<Device> -pw xxxxxx "ls -la mail_logs | sed -E s/$/###/g"
Zitat von @newbi2009:
Also, ich habe jetzt ein wenig rumexperimentiert, bekomme aber die plink.exe unter powershell garnicht zum rennen. Bei jedem Aufruf bekomme ich eine Fehlermeldung (unerwarteter token "-ssh" in Ausdruck oder Anweisung)
Funktioniert hier Problemlos, grundsätzlich kann man das "-ssh" aber ohnehin weglassen.Also, ich habe jetzt ein wenig rumexperimentiert, bekomme aber die plink.exe unter powershell garnicht zum rennen. Bei jedem Aufruf bekomme ich eine Fehlermeldung (unerwarteter token "-ssh" in Ausdruck oder Anweisung)
ich denke, ich werde es weiterhin in 2 Schritte machen müssen.
Zumal das scheinbar e' nicht komplett zu automatisieren ist, da die plink.exe immer auf einen keystroke wartet, der anscheinend NICHT umgangen/automatisiert werden kann. Diese Meldung erscheint immer, sobald man mit plink arbeitet:
"Keyboard-interactive authentication prompts from server"
sicher geht das, dafür ist "-batch" da.Zumal das scheinbar e' nicht komplett zu automatisieren ist, da die plink.exe immer auf einen keystroke wartet, der anscheinend NICHT umgangen/automatisiert werden kann. Diese Meldung erscheint immer, sobald man mit plink arbeitet:
"Keyboard-interactive authentication prompts from server"
Aber vielleicht kannst Du mir noch bei einem anderen Problem(chen) aushelfen, Für den Benutzer gibt es ein Passwort, das mit einem Anführungszeichen anfängt und endet. Wie maskiere ich das korrekt bei der Übergabe im CMD? => "Pa$$w0rt"
Da bin ich ehrlich gesagt auch überfragt. Würde dir auf dauer aber ohnehin dazu raten, die Anmeldung nicht über Passwort, sondern über RSA-Key zu machen.