Powershell - Zeilenumbruch hinter oder vor keyword in log Datei einfügen

Mitglied: newbi2009

newbi2009 (Level 1) - Jetzt verbinden

03.05.2021 um 14:22 Uhr, 421 Aufrufe, 13 Kommentare

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
Mitglied: HansDampf06
03.05.2021 um 14:59 Uhr
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
Bitte warten ..
Mitglied: TK1987
03.05.2021, aktualisiert um 15:51 Uhr
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.:
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
Bitte warten ..
Mitglied: HansDampf06
03.05.2021 um 15:00 Uhr
Kleine Ergänzung: Das gilt übrigens für alle (Konsolen)Befehle, die eine Liste ausgeben.
Bitte warten ..
Mitglied: HansDampf06
03.05.2021, aktualisiert um 15:11 Uhr
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.

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
Bitte warten ..
Mitglied: TK1987
03.05.2021, aktualisiert um 15:32 Uhr
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.
Bitte warten ..
Mitglied: HansDampf06
03.05.2021 um 15:46 Uhr
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
Bitte warten ..
Mitglied: TK1987
LÖSUNG 03.05.2021, aktualisiert um 16:07 Uhr
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.

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
Bitte warten ..
Mitglied: newbi2009
04.05.2021 um 07:58 Uhr
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)
Bitte warten ..
Mitglied: TK1987
04.05.2021, aktualisiert um 12:19 Uhr
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:
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:

Bitte warten ..
Mitglied: newbi2009
04.05.2021 um 12:37 Uhr
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
Bitte warten ..
Mitglied: TK1987
04.05.2021, aktualisiert um 13:49 Uhr
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:
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.
Bitte warten ..
Mitglied: newbi2009
05.05.2021 um 07:34 Uhr
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ß
Bitte warten ..
Mitglied: TK1987
05.05.2021 um 08:33 Uhr
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.
Bitte warten ..
Heiß diskutierte Inhalte
Off Topic
Aqui - Wir möchten den Hasen zurück
NixVerstehenVor 23 StundenAllgemeinOff Topic36 Kommentare

Lieber aqui, ich finde es sehr sehr schade, das du dich hier so überraschend abgemeldet hast. Ich habe auch von dir sehr viel gelernt ...

Netzwerke
Erfahrungen mit HPE Aruba Switches (Aruba OS)
sixofeightVor 1 TagAllgemeinNetzwerke13 Kommentare

Holla zusammen, Wer von euch setzt Aruba Switches (Aruba OS, ehemals HP ProCurve) ein und wie sind eure Erfahrungen bzw. wie zufrieden seid ihr ...

Webentwicklung
Webdesigner ist verschwunden
Janno100Vor 1 TagFrageWebentwicklung4 Kommentare

Hallo zusammen Kunde hat einen Webdesigner der die Domain des Kunden vor einigen Jahren einfach unter seinen eigenen Name weiter geführt hat. Diese haben ...

Exchange Server
Exchange weist Mails ohne Log Eintrag ab
Mr.RobotVor 13 StundenFrageExchange Server16 Kommentare

Guten Morgen, wir haben seit letzter Woche ein ganz spannendes "Problem" oder sollte ich eher Phänomen sagen? Wir haben eine Tochtergesellschaft die allerdings IT-Technisch ...

Windows 10
Was ist zu wenig
ukulele-7Vor 9 StundenFrageWindows 1013 Kommentare

Hallo, ich suche nach einer Quelle um Windows 10 Pro OEM Lizenzen zu beziehen, gerne auch erstmal ein paar als Testkauf. Nun ist das ...

Windows Server
Server clonen
oGutITVor 1 TagFrageWindows Server5 Kommentare

Hallo ich habe einen alten HP Server Gen8 und möchte diese auf einen HP Microserver Gen8 klonen. Auf dem HP Server ist 2W12KR2 am ...

Netzwerke
2 fritzen mit unterschiedlichen subnetzen einrichten
gelöst alpi972Vor 1 TagFrageNetzwerke7 Kommentare

Hallo, hoffe ich habs unters richtige thema gesetzt, ich habe 2 fritzboxen (eine 7490 als DSL Modem und eine 7430 als Brige), und will ...

Router & Routing
Windows Netzwerklaufwerke durch kaskadiertes Netzwerk nicht ansprechbar
TomAustriaVor 1 TagFrageRouter & Routing5 Kommentare

Hallo, wir hatten bisher nur ein "einfaches" Netzwerk und möchten dieses nun in getrennte Netzwerksegmente aufteilen: Das Netz 192.168.2.x haben wir beim AX1500 an ...