Entfernen Sie Komma und die nächsten 3 Zeichen aus der Zeile mit sed

Entfernen Sie Komma und die nächsten 3 Zeichen aus der Zeile mit sed

Ich schreibe ein Shell-Skript, um Fail2ban-Protokolle an eine Postgres-Datenbank zu senden. Die Ereigniszeitstempel im Anwendungsprotokoll zeigen ärgerlicherweise die Millisekunden des Ereignisses durch Kommas getrennt an (so: 11:01:26,899), was Postgres nicht mag und was ich nicht brauche. Hier ist ein Beispiel für eine Zeile aus dem Protokoll:

2023-02-09 11:01:26,899 fail2ban.filter         [6823]: INFO    [sshd] Found xxx.xxx.xxx.xxx - 2023-02-09 11:01:26

Dies ist die einzige Stelle in der Datei, an der ein Komma vorkommt. Ist es möglich, mit sed dieses Komma und die nächsten 3 Zeichen zu entfernen?

Antwort1

Der folgende Befehl entfernt Teilzeichenfolgen, die aus einem Komma und den drei darauf folgenden Zeichen bestehen:

sed 's/,...//' input.log

Hinweise und Erläuterungen:

  • Technisch gesehen führt der sBefehl eine Ersetzung durch. Wir entfernen etwas, indem wir es durch einen leeren String ersetzen. In unserem Code steht der entsprechende leere String zwischen dem zweiten und dritten Schrägstrich.

  • In regulären Ausdrücken ,ist es wörtlich und .entspricht jedem Zeichen.

  • Ich habe den Ausdruck in einfache Anführungszeichen gesetzt. In diesem Fall sind solche Anführungszeichen unnötig, aber im Allgemeinen sedenthält Code oft Zeichen, die von der Shell interpretiert werden (und das wollen wir nicht), daher ist es gut, sich an das Setzen von Anführungszeichen zu gewöhnen.

  • Unser Befehl führt höchstens eine Ersetzung pro Eingabezeile durch. In einer Zeile wird nur die erste übereinstimmende Teilzeichenfolge ersetzt.

  • ,...ist ein einfaches Muster. Wenn jede Zeile mit einem Zeitstempel im angegebenen Format beginnt, dannEs ist kein komplexes Muster oder eine komplexe Logik erforderlich.

Antwort2

Bei der angegebenen Datei würde input.logder folgende sedBefehl die Millisekundenkomponente aus dem Zeitstempel entfernen:

sed -r 's/([0-9]{2}:[0-9]{2}:[0-9]{2})(,[0-9]{3})/\1/' input.log

Dadurch werden die beiden obigen Erfassungsgruppen (Erfassungsgruppe eins ist die Zeit in %H:%M:%Sund Erfassungsgruppe zwei ist das Komma und die Millisekunden ,%3N) durch die erste Erfassungsgruppe ersetzt.

Dies könnte dann in eine andere Datei umgeleitet werden:

sed -r 's/([0-9]{2}:[0-9]{2}:[0-9]{2})(,[0-9]{3})/\1/' input.log > output.log

Wo output.logist die Ausgabedatei.

Aktualisieren:Unnötiges Flag entfernt g. Eine einfachere und prägnantere Lösung finden Sie in der Antwort von @kamil-maciorowski.

verwandte Informationen