newbi2009
Goto Top

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

Content-Key: 666338

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

Ausgedruckt am: 29.03.2024 um 07:03 Uhr

Mitglied: HansDampf06
HansDampf06 03.05.2021 um 14:59:37 Uhr
Goto Top
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
Mitglied: TK1987
TK1987 03.05.2021 aktualisiert um 15:51:26 Uhr
Goto Top
Moin,

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?!
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:
Regex Tutorial
Regex Legende

Mit Powershell, z.B.:
(Get-Content 'C:\Test\Datei.log') -Split '(?=[\-drwsxlSt]{10}\s)'  
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
Mitglied: HansDampf06
HansDampf06 03.05.2021 um 15:00:50 Uhr
Goto Top
Kleine Ergänzung: Das gilt übrigens für alle (Konsolen)Befehle, die eine Liste ausgeben.
Mitglied: HansDampf06
HansDampf06 03.05.2021 aktualisiert um 15:11:39 Uhr
Goto Top
Zitat von @TK1987:

Mit Powershell, z.B.:
(Get-Content 'C:\Test\Datei.log') -Split '(?=[\-drwsx]{10})'  
Heisst übersetzt: Splitte überall, wo 10 aufeinander folgende Zeichen folgen, die aus -, d, r, w, s oder x bestehen.

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
Mitglied: TK1987
TK1987 03.05.2021 aktualisiert um 15:32:19 Uhr
Goto Top
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.

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.
Mitglied: HansDampf06
HansDampf06 03.05.2021 um 15:46:23 Uhr
Goto Top
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
Mitglied: TK1987
Lösung TK1987 03.05.2021 aktualisiert um 16:07:01 Uhr
Goto Top
Zitat von @HansDampf06:
Wenn der Suchstring nicht ersetzt wird und das Splitting VOR dem Suchstring erfolgt, dann dürfte es passen.
Genau so.
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.
+1

Gruß Thomas
Mitglied: newbi2009
newbi2009 04.05.2021 um 07:58:27 Uhr
Goto Top
Super vielen Dank an alle, die hier Ihren "Gehirnschmalz" haben einfließen lassen.
Vielleicht nur zur Erklärung: Ja, ich bin unter Windows unterwegs. Das Log kommt aus einer Cisco ESA (Ironport), die ich leider nur über SSH abrufen kann, und da ich mir das ganze automatiesieren wollte, musste ich auf plink zurückgreifen. 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 (Wie Hans Dampf in der ersten Antwort geschrieben hat)
Mitglied: TK1987
TK1987 04.05.2021 aktualisiert um 12:19:27 Uhr
Goto Top
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:
plink.exe -ssh <userID>@<Device> -pw xxxxxx 'ls -la mail_logs | sed -E s/$/###/g'  
werden so am Ende jeder Zeile die 3 Rautezeichen angefügt? Wäre dann schon mal weniger fehleranfällig, diese hinterher zu splitten.

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'  
Mitglied: newbi2009
newbi2009 04.05.2021 um 12:37:40 Uhr
Goto Top
Also:
Da der Befehl ja in einem comand prompt (cmd) von Windows läuft, gibt es leider kein "sed"
Was aber tatsächlich merkwürdig ist, ist dass wenn ich mir die Ausgabe NICHT in eine Datei pipe, die Bildschirmausgabe "sauber" ist. D.h. nach jeder angezeigten Datei gibt es ganz sauber einen Zeilenumbruch. Sobald ich aber > Dateipfad anhänge, bekomme ich diese unsaubere Ausgabe.

Das ganze läuft auf einem Firmenrechner, auf dem ich keine Adminrechte habe, den Windows SSH client kann ich mir leider nicht installieren. Ausserdem bin ich ganz froh über den PuTTY, weil da ja (quasi umsonst und schon vorinstalliert) der plink gleich mitkommt.....
Eine ander Möglichkeit habe ich ganz einfach nicht, auf die Ironport zuzugreifen.
FTP und SFTP fallen komplett aus - obwohl das in diesem Fall ziemlich gut wäre. Für die Benutzung würde ich - wegen fehlender Sicherheit und Zertifizierung- eine Fristlose bekommen face-smile
Mitglied: TK1987
TK1987 04.05.2021 aktualisiert um 13:49:15 Uhr
Goto Top
Zitat von @newbi2009:
Da der Befehl ja in einem comand prompt (cmd) von Windows läuft
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 🤣
[...] 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"  
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.
Mitglied: newbi2009
newbi2009 05.05.2021 um 07:34:17 Uhr
Goto Top
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.
1. per cmd-batch die Log-Datei auf meinen Windows-client laden
2. per Powershell weiterverarbeiten

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"

siehe auch hier: https://stackoverflow.com/questions/64363893/how-to-suppress-keyboard-in ... (Ich hoffe ein Link auf ein externes Forum ist hier erlaubt, ansonsten bitte ich um Löschung des Links und um Entschuldigung!)

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"
Ich habe es ohne Erfolg mit ^"^Pa$$w0rt^"^ und '"'Pa$$w0rt'"' probiert.....

Danke und Gruß
Mitglied: TK1987
TK1987 05.05.2021 um 08:33:38 Uhr
Goto Top
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.
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.
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.